首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个比较返回假?

问为什么这个比较返回假?
EN

Stack Overflow用户
提问于 2013-01-30 12:50:52
回答 2查看 109关注 0票数 0

可能重复: Why does Double.NaN==Double.NaN return false?

这纯粹是出于好奇。

我做了这样的事:

代码语言:javascript
复制
public static void main(String args[]) throws Exception {
        System.out.println(Double.NaN==Double.NaN);
    }

输出为false。这不是应该返回true吗?

为什么会这样呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-30 12:52:02

来自Java Language Specifications

浮点运算符不会产生任何例外(第11节)。溢出运算产生有符号无穷大,下溢运算产生非正规化值或符号零,没有数学确定结果的运算产生NaN。因此,所有以NaN作为操作数的数值操作都会产生NaN。如前所述,NaN是无序的,因此,涉及一个或两个NaNs的数值比较操作返回false,any != NaN返回true,包括x为NaN时的x!=x。

这里的重要一句话是:

因此,涉及一两个NaNs的数字比较操作返回false。

票数 5
EN

Stack Overflow用户

发布于 2013-01-30 12:58:11

为了比较两双,更好地使用#compareTo(Double)方法,它能够以分离的方式处理NaN和XXX_INFINITY。

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

代码语言:javascript
复制
public static void main(String[] args) {
  Double d = new Double(Double.NaN);
  System.out.println(d.compareTo(Double.NaN) == 0);//returns true
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14604458

复制
相关文章

相似问题

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