引自Effective Java - 第二版,作者:Joshua Bloch
对于浮点字段,请使用 Double.compare 或 Float.compare 代替关系运算符,这些运算符在应用于浮点值时不遵守 compareTo 的一般约定。
它没有详细说明为什么会这样。
所以,我的问题是:
当与浮点值一起使用时,关系运算符在哪些方面不遵守 COMPARE To 的一般约定?
来自 javadoc:
public int compareTo(Double anotherDouble)
以数字方式比较两个 Double 对象。此方法执行的比较与 Java 语言数值比较运算符(<、<=、==、>=、>)执行的比较在应用于原始双精度值时有两种不同: 这种方法认为 Double.NaN 等于自身并且大于所有其他双精度值(包括 Double.POSITIVE_INFINITY)。 此方法认为 0.0d 大于 -0.0d。 这可确保此方法强加的 Double 对象的自然顺序与相等一致。
来自 JavaDoc for Double::compareTo
以数字方式比较两个 Double 对象。此方法执行的比较与 Java 语言数值比较运算符(<、<=、==、>=>)执行的比较在应用于原始双精度值时有两种不同:
此方法认为 Double.NaN 等于自身并大于所有其他双精度值(包括 Double.POSITIVE_INFINITY)。
此方法认为 0.0d 大于 -0.0d。
这确保了 Double.compareTo(Object)(将其行为转发给此方法)遵守 Comparable.compareTo 的一般约定,并且 Doubles 上的自然顺序与 equals 一致。
double d1 =Double.NaN;
double d2 = Double.NaN;
System.out.println(Double.valueOf(d1).equals(d2)); ---> true
System.out.println(Double.valueOf(d1).compareTo(d2)); ---> 0
System.out.println(d1 == d2); --->false
根据[Joshua_Bloch] Effective_Java,第3版
本书的先前版本(第2版)建议比较 方法比较使用关系的整型基元字段 运算符<和>以及浮点基元字段使用 静态方法 Double.compare 和 Float.compare。在 Java 7 中,静态 比较方法被添加到Java的所有盒装原始类中。 在比较方法中使用关系运算符<和>是 冗长且容易出错,不再推荐。和>和>
在比较实现中的字段值时比较方法,避免使用<和>运算符。相反,请使用盒装基元类或比较器中的静态比较方法比较器界面中的构造方法。和>