convertir doble a entero en java

114

En Java, quiero convertir un doble en un entero, sé que si haces esto:

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

obtienes y = 1. Si haces esto:

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

Probablemente obtendrá 2. Sin embargo, me pregunto: dado que las representaciones dobles de enteros a veces se ven como 1.9999999998 o algo así, ¿existe la posibilidad de que lanzar un doble creado a través de Math.round () aún resulte en un número truncado hacia abajo, en lugar de que el número redondeado que estamos buscando (es decir: 1 en lugar de 2 en el código como se representa)?

(y sí, lo digo como tal: ¿hay algún valor para x, donde y mostrará un resultado que es una representación truncada en lugar de redondeada de x?)

Si es así: ¿Existe una mejor manera de convertir un doble en un int redondeado sin correr el riesgo de truncamiento?


Pensé algo: Math.round (x) devuelve una longitud, no un doble. Por lo tanto: es imposible que Math.round () devuelva un número similar a 3.9999998. Por lo tanto, int (Math.round ()) nunca necesitará truncar nada y siempre funcionará.

vdMandele
fuente
6
Math.round (double) devuelve un long, no un doble.
qbert220

Respuestas:

95

¿Existe la posibilidad de que lanzar un doble creado a través de Math.round()todavía resulte en un número truncado hacia abajo?

No, round()siempre redondeará su doble al valor correcto, y luego, se convertirá en un valor longque truncará cualquier lugar decimal. Pero después del redondeo, no quedarán partes fraccionarias.

Aquí están los documentos de Math.round(double):

Devuelve el largo más cercano al argumento. El resultado se redondea a un número entero agregando 1/2, tomando el piso del resultado y lanzando el resultado a tipo largo. En otras palabras, el resultado es igual al valor de la expresión:

(long)Math.floor(a + 0.5d)
jjnguy
fuente
3
El punto importante es que el redondeo se realiza dentro del método de redondeo. Se devuelve un valor largo, que se puede convertir de forma segura en un int (asumiendo que el valor devuelto siempre estará dentro del rango int).
qbert220
Si. No puedo imaginar un / long / to int dando problemas. ¡Obviamente! Debería haber imaginado esto :(
vdMandele
1
Si bien es cierto que el truncamiento no se producirá debido al redondeo, es posible que aún no obtenga los resultados esperados simplemente debido a la conversión de double, que es un número muy grande, [max double: 1.7976931348623157E308]a int, que es mucho más pequeño [max int: 2147483647]. Sólo algo para tener en cuenta.
Nelda.techspiress
22

Para que el tipo Doublede datos int, puede utilizar lo siguiente:

Double double = 5.00;

int integer = double.intValue();
Charlie
fuente
Busca un valor redondeado.
Marqués de Lorne
1
No creo que eso dé lo que esperas para 4.99999999999 (dará 4 no 5)
murkle
10
Double perValue = 96.57;
int roundVal= (int) Math.round(perValue);

Resuelto mi propósito.

Nandkishor Gokhe
fuente