引用了约书亚布洛赫的有效Java -第二版
对于浮点字段,使用Double.compare或Float.compare代替关系运算符,而关系运算符在应用于浮点值时不遵守compareTo的一般约定。
它没有详细说明为什么会这样。
所以,我的问题是::
当与浮点值一起使用时,关系运算符在什么方面不遵守compareTo的一般契约?
发布于 2012-10-12 20:54:52
来自javadoc
public int compareTo(Double anotherDouble)对两个双对象进行数值比较。当应用于原始双值时,该方法执行的比较与Java语言数值比较运算符(<,<=、==、>=,>)执行的比较有两种不同之处:该方法认为Double.NaN等于自身,大于所有其他双值(包括Double.POSITIVE_INFINITY)。该方法认为0.0d大于-0.0d。这确保了该方法所施加的双对象的自然排序与相等。
发布于 2012-10-12 20:54:39
从JavaDoc到Double::compareTo
对两个双对象进行数值比较。当应用于原始双值时,该方法执行的比较与Java语言数值比较操作符(<、<=、==、>= >)执行的比较有两种不同之处:
这确保了Double.compareTo(Object) (它将其行为转发给此方法)服从Comparable.compareTo的一般契约,并且双子上的自然顺序与相等一致。
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发布于 2019-01-08 09:38:11
根据Joshua_Bloch Effective_Java,第3版
本书的前期版本(第2版)建议compareTo方法使用关系运算符<和>比较积分原语字段,并使用静态方法Double.compare和Float.compare比较浮点基元字段。在Java 7中,静态比较方法被添加到所有Java的装箱基元类中。在compareTo方法中使用关系运算符<和>是冗长且容易出错的,不再推荐使用。
在比较compareTo方法实现中的字段值时,请避免使用< and >操作符。相反,可以在装箱基元类中使用静态比较方法,或者在比较器接口中使用比较器构造方法。
https://stackoverflow.com/questions/12866922
复制相似问题