convertendo double para inteiro em java

114

Em Java, quero converter um duplo em um inteiro, sei se você fizer isso:

double x = 1.5;
int y = (int)x;

você obtém y = 1. Se você fizer isto:

int y = (int)Math.round(x);

Você provavelmente obterá 2. No entanto, estou me perguntando: já que as representações duplas de inteiros às vezes se parecem com 1.9999999998 ou algo assim, existe a possibilidade de que converter um duplo criado por meio de Math.round () ainda resulte em um número truncado para baixo, do que o número arredondado que procuramos (ou seja: 1 em vez de 2 no código conforme representado)?

(e sim, quero dizer isso da seguinte forma: existe algum valor para x, onde y mostrará um resultado truncado em vez de uma representação arredondada de x?)

Em caso afirmativo: Existe uma maneira melhor de transformar um duplo em um inteiro arredondado sem correr o risco de truncamento?


Imaginei algo: Math.round (x) retorna um longo, não um duplo. Portanto: é impossível para Math.round () retornar um número parecido com 3,9999999. Portanto, int (Math.round ()) nunca precisará truncar nada e sempre funcionará.

vdMandele
fonte
6
Math.round (double) retorna um longo, não um duplo.
qbert220

Respostas:

95

existe a possibilidade de que lançar um duplo criado via Math.round()ainda resulte em um número reduzido truncado

Não, round()sempre arredondará seu duplo para o valor correto e, em seguida, será convertido para um longque truncará quaisquer casas decimais. Mas após o arredondamento, não haverá nenhuma parte fracionária restante.

Aqui estão os documentos de Math.round(double):

Retorna o comprimento mais próximo do argumento. O resultado é arredondado para um inteiro adicionando 1/2, pegando a base do resultado e convertendo o resultado para digitar long. Em outras palavras, o resultado é igual ao valor da expressão:

(long)Math.floor(a + 0.5d)
jjnguy
fonte
3
O importante é que o arredondamento seja feito dentro do método arredondado. Um valor longo é retornado, que pode ser convertido com segurança em um int (assumindo que o valor retornado sempre estará dentro do intervalo int).
qbert220
Sim. Não consigo imaginar a / long / to dando problemas. Obviamente! Deveria ter
percebido
1
Embora seja verdade que o truncamento não ocorrerá por causa do arredondamento, você ainda pode não obter os resultados esperados simplesmente devido à conversão de double, que é um número muito grande, [max double: 1.7976931348623157E308]para int, que é muito menor [max int: 2147483647]. Apenas algo para ter em mente.
Nelda.techspiress
22

Para o tipo Doublede dados int, você pode usar o seguinte:

Double double = 5.00;

int integer = double.intValue();
Charlie
fonte
Ele está procurando um valor arredondado.
Marquês de Lorne
1
Não acho que isso dará o que você espera de 4,99999999999 (dará 4, não 5)
murkle
10
Double perValue = 96.57;
int roundVal= (int) Math.round(perValue);

Resolvido meu propósito.

Nandkishor Gokhe
fonte