2011-09-02 18 views
64

Cuando llamo al Math.ceil(5.2), la devolución es double6.0. Mi inclinación natural era pensar que Math.ceil(double a) devolvería un long. A partir de la documentación:¿Por qué Math.ceil devuelve un doble?

ceil(double a)

Devuelve el más pequeño (el más cercano al infinito negativo) double valor que no es menor que el argumento y es igual a un número entero matemática.

Pero por qué devolver un double en lugar de un long cuando el resultado es un 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 a un long, p. es

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.

+0

Ver http://stackoverflow.com/questions/3412449/why-does-math-round-return-a-long-but-math-floor-return-a-double – starblue

Respuesta

61

El rango de double es mayor que el de long. Por ejemplo:

double x = Long.MAX_VALUE; 
x = x * 1000; 
x = Math.ceil(x); 

Lo que se puede esperar de la última línea que debe hacer si Math.ceil regresaron long?

Tenga en cuenta que en valores muy grandes (positivos o negativos) los números se distribuyen muy poco, por lo que el siguiente entero mayor que el número entero x no será x + 1 si ve lo que quiero decir.

+0

Supongo que en tu última frase eres hablando de una pérdida de precisión, pero creo que eso no depende de lo alto que sea el número sino del número de dígitos significativos (en binario). Trataré de encontrar un ejemplo. – aalku

+0

@ user270349: la brecha absoluta entre los valores dobles consecutivos aumenta a medida que el valor aumenta. La cantidad de dígitos significativos representados permanece igual (excepto para números subnormales). –

+2

Ejemplo: '2^60' se puede representar como double mientras' 2^60 (+/-) 1' no puede – aalku

13

Un doble puede ser mayor que Long.MAX_VALUE. Si llama al Math.ceil() en dicho valor, esperaría devolver el mismo valor. Sin embargo, si devuelve un valor largo, el valor sería incorrecto.

+0

los valores 'double' que son más grandes que' Long.MAX_VALUE' pueden no representarse exactamente, por lo que el resultado 'double' de' ceil (big_double) 'no será' big_double + 1'. Entonces sigue siendo incorrecto ... –

+0

@CiprianTomoiaga tienes razón en que no será big_double +1 ya que sería big_double. Cualquier valor que sea demasiado grande para representarse como 'largo' no tiene parte fraccionaria. –

Cuestiones relacionadas