java - round - ¿Por qué Math.floor devuelve un doble?
quitar decimales javascript (6)
¿Qué quieres que vuelva si le das un doble más grande que el mayor int o largo?
(Es cierto que si es más grande que la longitud más larga, la precisión será baja de todos modos, puede no ser el número teórico más cercano, pero aun así ...)
El javadoc oficial says que Math.floor devuelve un doble que es "igual a un entero matemático", pero ¿por qué no debería devolver un int?
De acuerdo con el mismo javadoc:
Si el argumento es NaN o un infinito o cero positivo o cero negativo, entonces el resultado es el mismo que el argumento. No se puede hacer eso con un int.
El valor doble más grande también es más grande que el int más grande, por lo que debería ser un largo.
Del mismo modo que existe un entero y una división de punto flotante en Java, existen formas enteras y de punto flotante para hacer floor:
double f = Math.floor(x);
o
int k = (int) x;
pero siempre debe tener cuidado con el uso del piso con aritmética de precisión finita: su cálculo de x puede producir algo como 1.99999999, que será derribado a 1, no a 2 en ambas formas. Hay muchos algoritmos por ahí que necesitan evitar esta limitación para evitar producir resultados incorrectos para algunos valores de entrada.
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 número entero, obtendrá un desbordamiento. Los enteros solo tienen 32 bits.
Devolver el número entero como un doble es lo correcto que hay que hacer aquí porque ofrece un rango de números mucho más útil que un número entero.
Otros te han dicho por qué, voy a decirte cómo redondear correctamente dado que quieres hacer esto. Si solo va a usar números positivos, puede usar esta afirmación:
int a=(int) 1.5;
Sin embargo, el (int) siempre se redondea hacia 0. Por lo tanto, si quieres 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);
}
Para que el error y otros valores no enteros puedan conectarse en cascada correctamente a través de una serie de cálculos.
Por ejemplo, si alimenta Not a Number (NaN) en Math.floor, lo transmitirá.
Si devuelve un número entero, no puede pasar este estado o los errores a lo largo, y podría obtener malos resultados de un cálculo anterior que se ve bien, pero que están mal después del procesamiento posterior.
-Adán