Respuestas:
Según el mismo Javadoc:
Si el argumento es NaN
infinito, cero positivo o cero negativo, el resultado es el mismo que el argumento. No puedo hacer eso con un int
.
El double
valor más grande también es más grande que el más grande int
, por lo que debería ser a long
.
Es por precisión. El tipo de datos doble tiene una mantisa de 53 bits. Entre otras cosas, eso significa que un doble puede representar todo entero hasta 2 ^ 53 sin pérdida de precisión.
Si almacena un número tan grande en un entero, obtendrá un desbordamiento. Los enteros solo tienen 32 bits.
Devolver el entero como un doble es lo correcto aquí porque ofrece un rango de números útiles mucho más amplio que el que podría tener un entero.
Otros te han dicho el por qué, yo te diré cómo redondear correctamente dado que quieres hacer esto. Si solo va a usar números positivos, puede usar esta declaración:
int a=(int) 1.5;
Sin embargo, el (int) siempre se redondea hacia 0. Por lo tanto, si desea hacer un número negativo:
int a=(int) -1.5; //Equal to -1
En mi caso, no quería hacer esto. Usé el siguiente código para hacer el redondeo, y parece manejar bien todos los casos extremos:
private static long floor(double a)
{
return (int) Math.floor(a);
}
(int) Math.floor(a)
? Probablemente sea más eficiente y más corto.
(int) Math.floor(a)
simplemente puede escribir (int) a
, si a es positivo.
Así como hay una división de entero y una de punto flotante en Java, hay formas de entero y de punto flotante para hacer el piso:
double f = Math.floor(x);
o
int k = (int) x;
pero siempre debe tener cuidado con el uso de piso con aritmética de precisión finita: su cálculo de x puede producir algo como 1.99999999, que será reducido a 1, no a 2 por ambas formas. Existen muchos algoritmos que necesitan solucionar esta limitación para evitar producir resultados incorrectos para algunos valores de entrada.
De modo que el error y otros valores que no sean enteros puedan pasar correctamente en cascada a través de una serie de cálculos.
Por ejemplo, si introduce Not a Number (NaN) en Math.floor, lo pasará.
Si devolvió un número entero, no podría pasar estos estados o errores, y podría obtener malos resultados de un cálculo anterior que se ve bien pero es incorrecto después de un procesamiento posterior.