El Javadoc oficial dice que Math.floor()
devuelve un double
"igual a un entero matemático", pero entonces ¿por qué no debería devolver un int
?
104
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.
fuente
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:
Sin embargo, el (int) siempre se redondea hacia 0. Por lo tanto, si desea hacer un número negativo:
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:
fuente
(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.¿Qué le gustaría que regresara si le diera un doble más grande que el mayor int o long?
(Es cierto que si es más grande que el largo más grande, la precisión será baja de todos modos; puede que no sea el entero teórico más cercano, pero aun así ...)
fuente
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:
o
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.
fuente
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.
fuente