2009-02-04 14 views

Respuesta

64

Según el mismo javadoc:

Si el argumento es NaN o un infinito o cero o negativo cero positivo, entonces el resultado es el mismo que el argumento. No se puede hacer eso con un int.

El valor doble de grande es también mayor que el mayor int, por lo que tendría que ser mucho.

+1

¿Adivina que también se aplica para .Net? – Graviton

+33

parece inconsistente con las funciones Math.Round, que devuelven int/long y manejan los casos especiales de una manera diferente. – zod

+1

Observe que el Javadoc dice que devuelve _ "el mayor valor de coma flotante *** (más cercano al infinito positivo) *** que sea menor o igual que el argumento y que sea igual a un entero matemático" _. Dado un valor _x> 2^53_ que no será el mismo que el valor con su parte fraccionaria truncada. Puede ser bastante más pequeño que eso. –

13

Es para 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 de un entero obtendrá un desbordamiento. Los enteros solo tienen 32 bits.

Devolver el número entero como un doble es lo correcto, ya que ofrece un rango de números mucho más útil que un número entero.

+0

Podría regresar mucho para hacer frente a tales valores, por supuesto. Aún así, tendrás que decidir qué hacer con los dobles> 2^63. –

+1

@Jon, cierto, pero eso daría como resultado un impacto en el rendimiento (no hay instrucciones de conversión de largo a doble en ningún conjunto de instrucciones del que tenga conocimiento). Me pregunto qué hace Math.floor con los dobles> 2^53 en primer lugar. Algunos resultados no son representables. –

+0

Pero luego, la forma pseudo-idiomática (int) Math.floor (foo), que también aparece en el javadoc oficial es insegura ya que el resultado puede no encajar en un int, ¿estoy en lo cierto? Y una vez más, ¿cuál es una forma segura de utilizar Math.floor, ya que el resultado puede no ajustarse incluso en un largo? – Raibaz

0

para que el error y otros valores no enteros pueden conectar en cascada correctamente a través de una serie de cálculos.

Por ejemplo, si introduce Not a Number (NaN) en Math.floor, lo pasará.

Si devuelve 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 está mal después de un procesamiento posterior.

-Adam

3

¿Qué le gustaría que vuelva si usted le dio un doble más grande que el más grande int o largo?

(Es cierto que si es más grande que el más grande de largo la precisión será baja de todos modos - puede que no sea el número entero más próximo teórico - pero aún así ...)

0

Así como no es un entero y un punto flotante división en Java, hay enteros y punto flotante formas de hacerlo baja:

double f = Math.floor(x); 

o

int k = (int) x; 

pero siempre hay que tener cuidado con el uso de suelo con f Aritmética de precisión de inite: su cálculo de x puede producir algo como 1.99999999 que se ampliará 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.

+4

Esto casi funciona, excepto que (int) -1.5 = -1; – PearsonArtPhoto

5

Otros han dicho que el por qué, voy a decirle cómo redondear correctamente dado que quiere hacer esto. Si sólo se va a utilizar números positivos, entonces se puede utilizar esta declaración:

int a=(int) 1.5; 

Sin embargo, el (int) siempre redondea hacia 0. Por lo tanto, si usted quiere hacer un número negativo:

int a=(int) -1.5; //Equal to -1 

En mi caso, yo no quería hacer esto.Utilicé el siguiente código para hacer el redondeo, y parece manejar bien todos los casos extremos:

private static long floor(double a) 
{ 
    return Math.round(Math.floor(a)); 
} 
+2

¿Por qué no usar '(int) Math.floor (a)'? Probablemente sea más eficiente y más corto. –

Cuestiones relacionadas