2012-04-12 4 views
18

Ich dachte, dass Ergebnis einer mathematischen Operation auf einem NaN mir eine NaN zurück geben sollte, aber Math.round(Float.NaN) == 0Warum gibt Math.round() 0 für NaN-Argumente zurück?

Was ist der Grund für ein solches Verhalten von Math.round()?

Merkwürdigerweise verhält sich C# anders: http://msdn.microsoft.com/en-us/library/75ks3aby.aspx

+0

wie @pst gesagt hat, ist das normale Verhalten für NaN definiert: "Wenn das Argument NaN ist, ist das Ergebnis 0". –

+0

Die Begründung ist, dass es früher einen Fehler in 'Math.round()' gab, wenn er auf NaN aufgerufen wurde, könnte er möglicherweise zukünftige Aufrufe von 'Math.round()' ruinieren: http://bugs.sun.com/bugdatabase/ view_bug.do?bug_id=4755500 –

+1

Der Unterschied ist wahrscheinlich; in Java gibt es 'long' zurück, das nicht'Double.NaN' sein kann, während ein C# ein' double' zurückgibt. –

Antwort

13

Haha. Ich will mich in den Kopf schlagen.

Math.round(double) gibt ein langen und lange nicht NaN sein kann. Die Alternative ist eine Ausnahme.

In C# ist das Ergebnis immer noch ein double.

+0

Die Frage dreht sich um Floats –

+0

@HunterMcMillen Ja, 'lang Math.round (double)' ist wie es definiert ist in Java. Diese Antwort erklärt, warum es in "0" und nicht "NaN" zurückkehrt. Wenn es "double Math.round (double)" wäre, dann könnte der C# -Weg geeigneter sein ... –

+0

@Hunter: Die Operation * gibt * a 'long' zurück. –

27

Math.round() ist definiert als (long)Math.floor(a + 0.5d).

  1. Wenn a ist NaN, dann a+0.5dNaN ist.
  2. Math.floor() wird auf StrictMath.floor() zurückgesetzt, die NaN zurückgibt, wenn sie in NaN übergeben wird.
  3. Wenn NaN zu einem long Gießen, gibt es 0

So letztlich kommt es darauf an, warum NaN auf ein long kehrt Casting 0. Dieses Problem wird in this question gründlich diskutiert wurde.

+0

+1 für das Graben in die Umsetzung ein wenig! Haben Sie Links zu dem [Open Source JDK] Code für die entsprechenden Funktionen? –

+4

+1 In Java 7 wurde diese Definition aufgrund dieses Problems gelöscht [Warum Math.round (0.499999999999999917) auf Java 6 auf 1 aufrundet] (http://vanillajava.blogspot.co.uk/2012/04/why-mathround0499999999999999917) -rounds.html) –