Double クラスでの符号付きゼロの使用を理解することが重要です。(多くの経験豊富な Java プログラマーはそうではありません)。
簡単な答えは、(定義により) Double クラスによって提供されるすべてのメソッド (つまり、equals()、compare()、compareTo() など) で「-0.0 は 0.0 より小さい」ということです。
Double を使用すると、すべての浮動小数点数を「数直線上で完全に並べ替える」ことができます。プリミティブは、ユーザーが物事を考える方法で動作します (現実世界の定義) ... 0d = -0d
次のスニペットは、動作を示しています...
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
関連性があり、背景をうまく説明している他の投稿があります...
1:浮動小数点数に符号付きゼロがあるのはなぜですか?
2: Java の Double.compare(double, double) がそのまま実装されているのはなぜですか?
そして注意事項が…
Double クラスで「-0.0 は 0.0 未満です」ということを知らないと、Double のequals()やcompare()やcompareTo( ) などのメソッドを論理テストで使用するときに引っかかることがあります。たとえば、見て...
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");
}
equals の場合は ... new Double(d3).equals(0d) || を試すことができます。new Double(d3).equals(-0d)