Java signed zero and boxing Java signed zero and boxing java java

Java signed zero and boxing


It is all explained in the javadoc:

Note that in most cases, for two instances of class Double, d1 and d2, the value of d1.equals(d2) is true if and only if

   d1.doubleValue() == d2.doubleValue() 

also has the value true. However, there are two exceptions:

  • If d1 and d2 both represent Double.NaN, then the equals method returns true, even though Double.NaN==Double.NaN has the value false.
  • If d1 represents +0.0 while d2 represents -0.0, or vice versa, the equal test has the value false, even though +0.0==-0.0 has the value true.

This definition allows hash tables to operate properly.


Now you might ask why 0.0 == -0.0 is true. In fact they are not strictly identical. For example:

Double.doubleToRawLongBits(0.0) == Double.doubleToRawLongBits(-0.0); //false

is false. However, the JLS requires ("in accordance with the rules of the IEEE 754 standard") that:

Positive zero and negative zero are considered equal.

hence 0.0 == -0.0 is true.


It important to undertand the use of signed zero in the Double class. (Loads of experienced Java programmers don't).

The short answer is that (by definition) "-0.0 is less than 0.0" in all the methods provided by the Double class (that is, equals(), compare(), compareTo(), etc)

Double allows all floating point numbers to be "totally ordered on a number line".Primitives behave the way a user will think of things (a real world definition) ... 0d = -0d

The following snippets illustrate the behaviour ...

final double d1 = 0d, d2 = -0d;System.out.println(d1 == d2); //prints ... trueSystem.out.println(d1 < d2);  //prints ... falseSystem.out.println(d2 < d1);  //prints ... falseSystem.out.println(Double.compare(d1, d2)); //prints ... 1System.out.println(Double.compare(d2, d1)); //prints ... -1

There are other posts that are relevant and nicely explain the background ...

1: Why do floating-point numbers have signed zeros?

2: Why is Java's Double.compare(double, double) implemented the way it is?

And a word of caution ...

If you don't know that, in the Double class, "-0.0 is less than 0.0", you may get caught out when using methods like equals() and compare() and compareTo() from Double in logic tests. For example, look at ...

final double d3 = -0d; // try this code with d3 = 0d; for comparisonif (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"); }

and for equals you might try ... new Double(d3).equals(0d) || new Double(d3).equals(-0d)


By using == statement you are comparing values. With equals your are comparing objects.