首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关系运算符以什么方式不服从浮点值的compareTo契约?

问关系运算符以什么方式不服从浮点值的compareTo契约?
EN

Stack Overflow用户
提问于 2012-10-12 20:51:01
回答 3查看 753关注 0票数 11

引用了约书亚布洛赫的有效Java -第二版

对于浮点字段,使用Double.compare或Float.compare代替关系运算符,而关系运算符在应用于浮点值时不遵守compareTo的一般约定。

它没有详细说明为什么会这样。

所以,我的问题是::

当与浮点值一起使用时,关系运算符在什么方面不遵守compareTo的一般契约?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-12 20:54:52

来自javadoc

代码语言:javascript
复制
 public int compareTo(Double anotherDouble)

对两个双对象进行数值比较。当应用于原始双值时,该方法执行的比较与Java语言数值比较运算符(<,<=、==、>=,>)执行的比较有两种不同之处:该方法认为Double.NaN等于自身,大于所有其他双值(包括Double.POSITIVE_INFINITY)。该方法认为0.0d大于-0.0d。这确保了该方法所施加的双对象的自然排序与相等。

票数 6
EN

Stack Overflow用户

发布于 2012-10-12 20:54:39

从JavaDoc到Double::compareTo

对两个双对象进行数值比较。当应用于原始双值时,该方法执行的比较与Java语言数值比较操作符(<、<=、==、>= >)执行的比较有两种不同之处:

  • 此方法认为Double.NaN等于它自己,并且大于所有其他双值(包括Double.POSITIVE_INFINITY)。
  • 该方法认为0.0d大于-0.0d。

这确保了Double.compareTo(Object) (它将其行为转发给此方法)服从Comparable.compareTo的一般契约,并且双子上的自然顺序与相等一致。

代码语言:javascript
复制
    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
票数 4
EN

Stack Overflow用户

发布于 2019-01-08 09:38:11

根据Joshua_Bloch Effective_Java,第3版

本书的前期版本(第2版)建议compareTo方法使用关系运算符<和>比较积分原语字段,并使用静态方法Double.compare和Float.compare比较浮点基元字段。在Java 7中,静态比较方法被添加到所有Java的装箱基元类中。在compareTo方法中使用关系运算符<和>是冗长且容易出错的,不再推荐使用。

在比较compareTo方法实现中的字段值时,请避免使用< and >操作符。相反,可以在装箱基元类中使用静态比较方法,或者在比较器接口中使用比较器构造方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12866922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档