Bom dia! Estou desenvolvendo um jogo da velha e quero passar a posição informando um valor DOUBLE e depois extrair por meio de um cálculo matemático a linha e a coluna. Exemplo: posição 1,2 = linha 1, coluna 2.
Eu sei que eu poderia pedir primeiro a linha depois a coluna mas assim é muito fácil e eu não quero assim.
Só para vocês terem uma idéia melhor está aqui o método onde quero fazer isso:
public void jogar() {
escreverMatriz();
System.out.print("Posição: ");
double posicao = ler.nextDouble();
int linha = //(posicao * 10 / 2) - 1;
int coluna = //(posicao % )
}
E qual o problema? Converta em String, faça split com o separador de unidades decimais (ponto ou vírgula, dependendo o caso) e pronto.
Eu não queria fazer conversão mas é uma solução. É que eu sei que tem como fazer porque eu já fiz mas não me lembro qual era o cálculo. Mas obrigado pela resposta.
double linhaColuna = 1.2;
int linha = (int) linhaColuna;
int coluna = (int) ((linhaColuna - linha) * 10);
Olá @staroski, eu testei aqui e a coluna deu 1. Você testou? Quanto deu?
Não havia testado, só postei a lógica, que está correta, veja:
double numeroReal = 1.2;
int parteInteira = (int) numeroReal;
int parteDecimal = (int) ((numeroReal - parteInteira) * 10);
System.out.println(parteInteira + " " + parteDecimal);
Acontece que a parteDecimal
está ficando com 1
devido à uma característica da operação abaixo:
numeroReal - parteInteira
Isto é, 1.2 - 1
ao invés de retornar 0.2
acaba retornando 0.19999999999999996
;
0.19999999999999996 * 10 = 1.9999999999999996;
Com o cast para int
esse número é truncado para 1
.
Como resolver então?
Simples, somar 0.5
na operação da parte decimal antes de fazer o cast para int
, isso ocasionará um arredondamento da operação, dessa forma:
double numeroReal = 1.2;
int parteInteira = (int) numeroReal;
int parteDecimal = (int) (0.5 + ((numeroReal - parteInteira) * 10));
System.out.println(parteInteira + " " + parteDecimal);
1 curtida
Obrigado pela explicação, a lógica está certa mesmo.
1 curtida