Ich habe Code, um die prozentuale Differenz zwischen 2 Zahlen zu berechnen - (oldNum - newNum) / oldNum * 100;
- wobei beide Zahlen double
s sind. Ich hatte erwartet, dass ich eine Art Überprüfungs- / Ausnahmebehandlung hinzufügen muss, falls oldNum 0 ist. Als ich jedoch einen Testlauf mit Werten von 0.0 für oldNum und newNum durchführte, wurde die Ausführung fortgesetzt, als wäre nichts passiert und es wurde kein Fehler ausgegeben. Das Ausführen dieses Codes mit int
s würde definitiv eine arithmetische Ausnahme für die Division durch Null verursachen. Warum ignoriert Java es, wenn es um double
s geht?
68
Antworten:
Das Ergebnis der Division durch Null ist mathematisch gesehen undefiniert , was mit einem float / double (als
NaN
- keine Zahl) ausgedrückt werden kann , es ist jedoch in keinem fundamentalen Sinne falsch.Da eine Ganzzahl einen bestimmten numerischen Wert enthalten muss, muss beim Umgang mit ihnen ein Fehler auf die Division durch Null geworfen werden.
quelle
Java
float
unddouble
Typen implementieren, wie so ziemlich jede andere Sprache (und so ziemlich jede Hardware-FP-Einheit), den IEEE 754- Standard für Gleitkomma-Mathematik, der die Division durch Null vorschreibt, um einen speziellen "Unendlichkeit" -Wert zurückzugeben. Das Auslösen einer Ausnahme würde tatsächlich gegen diesen Standard verstoßen.Die Ganzzahlarithmetik (implementiert als Zweierkomplementdarstellung durch Java und die meisten anderen Sprachen und Hardware) ist unterschiedlich und weist keine speziellen Unendlichkeits- oder NaN-Werte auf. Daher ist das Auslösen von Ausnahmen dort ein nützliches Verhalten.
quelle
float
unddouble
verursacht keine Ausnahmen. Vielen Dank.Die Art und Weise, wie ein Double gespeichert wird, unterscheidet sich erheblich von einer int. Unter http://firstclassthoughts.co.uk/java/traps/java_double_traps.html finden Sie eine ausführlichere Erläuterung, wie Java mit Doppelberechnungen umgeht. Sie sollten sich auch über Gleitkommazahlen informieren, insbesondere über das Konzept von Not a Number (NaN) .
Wenn Sie mehr über die Gleitkommadarstellung erfahren möchten, empfehlen wir Ihnen, dieses Dokument zu lesen (Word-Format, sorry). Es befasst sich mit der binären Darstellung von Zahlen, die für Ihr Verständnis hilfreich sein kann.
quelle
Obwohl Java - Entwickler über die Doppel primitive Art und Know -
Double
Klasse, während Gleitkomma - Arithmetik zu tun zahlen sie nicht genug AufmerksamkeitDouble.INFINITY
,NaN
,-0.0
und andere Regeln , die die arithmetischen Berechnungen mit ihnen regieren.Die einfache Antwort auf diese Frage ist, dass sie nicht werfen
ArithmeticException
und zurückkehren wirdDouble.INFINITY
. Beachten Sie auch, dass der Vergleichx == Double.NaN
immer ausgewertet wirdfalse
, auch wenn erx
selbst ein istNaN
.Um zu testen, ob a
x
istNaN
, sollte man den Methodenaufruf verwenden, umDouble.isNaN(x)
zu überprüfen, ob die angegebene Nummer NaN ist oder nicht. Dies ist sehr nah anNULL
inSQL
.Es kann für Sie hilfreich sein.
quelle
Wenn durch Null geteilt (0 oder 0,00)
Wenn Sie double durch 0 teilen, zeigt JVM Infinity an .
public static void main(String [] args){ double a=10.00; System.out.println(a/0); }
Konsole:
Infinity
Wenn Sie int durch 0 teilen, löst JVM eine arithmetische Ausnahme aus .
public static void main(String [] args){ int a=10; System.out.println(a/0); }
Konsole:
Exception in thread "main" java.lang.ArithmeticException: / by zero
Aber wenn wir int durch 0.0 teilen, zeigt JVM Infinity:
public static void main(String [] args){ int a=10; System.out.println(a/0.0); }
Konsole:
Infinity
Dies liegt daran, dass JVM cast int automatisch in double eingibt, sodass anstelle von ArithmeticException unendlich wird.
quelle