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

The explanation is in the comments in the code. Java has double values for both 0.0 and -0.0, as well as “not a number” (NaN). You can’t use simple == operator for these values. Take a peek into the doubleToLongBits() source and at the Javadoc for the Double.equals() method:

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.

Leave a Comment