2012-04-12 16 views
18

pensé que resulten de la operación matemática en un NaN me diera un NaN atrás, pero Math.round(Float.NaN) == 0¿Por qué Math.round() devuelve 0 para argumentos NaN?

¿Cuál es la razón de tal comportamiento de Math.round()?

Curiosamente, C# comporta de manera diferente: http://msdn.microsoft.com/en-us/library/75ks3aby.aspx

+0

como @pst ha dicho, es el comportamiento normal definido para NaN: "Si el argumento es NaN, el resultado es 0". –

+0

La razón fundamental es que solía haber un error en 'Math.round()' cuando se llamaba en NaN, podía arruinar futuras llamadas a 'Math.round()': http://bugs.sun.com/bugdatabase/ view_bug.do?bug_id=4755500 –

+1

Es probable que la diferencia sea; en Java, devuelve 'long' que no puede ser' Double.NaN', mientras que un C# devuelve 'double' –

Respuesta

13

Jaja. Quiero golpearme en la cabeza.

Math.round(double) devuelve una larga y una larga no puede ser NaN. La alternativa es una excepción.

En C# el resultado sigue siendo double.

+0

La pregunta es sobre el redondeo Floats –

+0

@HunterMcMillen Sí,' long Math.round (double) 'es cómo se define en Java. Esta respuesta explica por qué regresa en '0' y no' NaN'. Si fuera 'double Math.round (double)', entonces el modo C# podría ser más apropiado ... –

+0

@Hunter: La operación * devuelve * un 'largo'. –

27

Math.round() se define como (long)Math.floor(a + 0.5d).

  1. Si a es NaN, entonces es a+0.5dNaN.
  2. Math.floor() se desglosa en StrictMath.floor() que devuelve NaN cuando se pasa en NaN.
  3. Cuando se lanza a una NaNlong, devuelve 0

Por lo tanto, en última instancia, todo se reduce a qué fundición NaN a un long devuelve 0. Este problema se ha discutido a fondo en this question.

+0

+1 para profundizar un poco en la implementación! ¿Tiene enlaces al código [Open Source JDK] para las funciones apropiadas? –

+4

+1 En Java 7, esta definición se ha eliminado debido a este problema [Why Math.round (0.499999999999999917) se redondea a 1 en Java 6] (http://vanillajava.blogspot.co.uk/2012/04/why-mathround0499999999999999917 -rounds.html) –

Cuestiones relacionadas