Es ist wichtig, die Verwendung von signierter Null in der Doppel Klasse undertand. (Viele erfahrene Java-Programmierer nicht).
Die kurze Antwort ist, dass (per Definition) "-0,0 weniger als 0.0" in allen von der Doppel-Klasse Methoden (dh, equals(), vergleichen(), compareTo(), usw.)
Mit Double können alle Gleitpunktzahlen "auf einer Nummernleitung vollständig angeordnet" werden. Primitive verhalten sich so, wie ein Benutzer über Dinge denkt (eine echte Definition) ...0T = -0D
Die folgenden Schnipsel das Verhalten veranschaulichen ...
final double d1 = 0d, d2 = -0d;
System.out.println(d1 == d2); //prints ... true
System.out.println(d1 < d2); //prints ... false
System.out.println(d2 < d1); //prints ... false
System.out.println(Double.compare(d1, d2)); //prints ... 1
System.out.println(Double.compare(d2, d1)); //prints ... -1
Es gibt andere Stellen, die relevant sind und schön den Hintergrund erklären ...
1: Why do floating-point numbers have signed zeros?
2: Why is Java's Double.compare(double, double) implemented the way it is?
Und ein Wort der Vorsicht ...
Falls Sie nicht wissen, in der Doppel Klasse, „-0,0 weniger als 0,0“, können Sie heraus hängen bleiben, wenn Methoden wie equals mit () und vergleichen() und compareTo() von Double in Logiktests. Blick zum Beispiel auf ...
final double d3 = -0d; // try this code with d3 = 0d; for comparison
if (d3 < 0d) {
System.out.println("Pay 1 million pounds penalty");
} else {
System.out.println("Good things happen"); // this line prints
}
if (Double.compare(d3, 0d) < 0) { //use Double.compare(d3, -0d) to match the above behaviour
System.out.println("Pay 1 million pounds penalty"); // this line prints
} else {
System.out.println("Good things happen");
}
und für gleich Sie könnten versuchen, ... neue Doppel (d3) .equals (0T) || neu Double (d3) .equals (-0d)
Der übliche Weg, dies zu vermeiden, ist '0.0' hinzuzufügen. Sehen Sie [hier] (http://stackoverflow.com/a/8153449/823393) für ein wenig mehr Details. – OldCurmudgeon