java - redondear - ¿Por qué Math.ceil devuelve un doble?
math.round java (2)
Cuando llamo a Math.ceil(5.2)
el retorno es el double
6.0
. Mi inclinación natural era pensar que Math.ceil(double a)
regresaría long
. De la documentación:
ceil(double a)
Devuelve el valor
double
más pequeño (más cercano al infinito negativo) que no es menor que el argumento y es igual a un número entero matemático.
Pero ¿por qué devolver un double
lugar de un long
cuando el resultado es un número entero? Creo que entender la razón detrás de esto podría ayudarme a entender Java un poco mejor. También podría ayudarme a descubrir si me meteré en problemas lanzando por long
, por ejemplo,
long b = (long)Math.ceil(a);
siempre lo que creo que debería ser? Me temo que podría haber algunos casos límites que son problemáticos.
El rango de double
es mayor que el de long
. Por ejemplo:
double x = Long.MAX_VALUE;
x = x * 1000;
x = Math.ceil(x);
¿Qué esperarías de la última línea si Math.ceil
regresara long
?
Tenga en cuenta que a valores muy grandes (positivos o negativos) los números terminan siendo distribuidos de forma muy dispersa, por lo que el siguiente entero mayor que el entero x
no será x + 1
si ve lo que quiero decir.
Un doble puede ser más grande que Long.MAX_VALUE
. Si llama a Math.ceil()
en tal valor, esperaría devolver el mismo valor. Sin embargo, si devuelve un valor largo, el valor sería incorrecto.