È importante sottolineare l'utilizzo dello zero firmato nella classe Double. (Non ci sono carichi di programmatori Java esperti).
La risposta breve è che (per definizione) "-0.0 è inferiore a 0,0" in tutte le modalità previste dalla classe doppia (vale a dire, equals(), confrontare(), compareTo(), ecc)
Double consente a tutti i numeri in virgola mobile di essere "totalmente ordinati su una linea numerica". I primitivi si comportano come un utente pensa alle cose (una definizione del mondo reale) ...0d = -0d
I seguenti frammenti illustrano il comportamento ...
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
Ci sono altri posti che sono rilevanti e ben spiegano lo sfondo ...
1: Why do floating-point numbers have signed zeros?
2: Why is Java's Double.compare(double, double) implemented the way it is?
E una parola di cautela ...
Se non si sa che, nella classe doppio, "-0.0 è inferiore a 0.0", si potrebbe rimanere intrappolati quando si utilizzano metodi come equals () e compare() e compareTo() da Double in test logici. Ad esempio, guardate ...
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");
}
e per uguale si potrebbe provare ... nuovo doppio (D3) .equals (0d) || new Double (d3) .equals (-0d)
Il solito modo per evitare questo è aggiungere '0.0'. Vedi [qui] (http://stackoverflow.com/a/8153449/823393) per ulteriori dettagli. – OldCurmudgeon