0

可能重复:
为什么 Double.NaN==Double.NaN 返回 false?

这纯粹是出于好奇。

我做了这样的事情:

public static void main(String args[]) throws Exception {
        System.out.println(Double.NaN==Double.NaN);
    }

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

为什么会这样?

4

2 回答 2

5

来自Java 语言规范

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

这里重要的一句话是:

因此涉及一个或两个 NaN 的数值比较操作返回 false

于 2013-01-30T12:52:02.150 回答
0

为了比较两个 Doubles 更好地使用该方法,#compareTo(Double)它能够以分开的方式处理。NaNXXX_INFINITY

以数字方式比较两个 Double 对象。当应用于原始双精度值时,此方法执行的比较与 Java 语言数值比较运算符(<、<=、==、>=、>)执行的比较有两种不同之处:

此方法认为 Double.NaN 等于其自身并且大于所有其他双精度值(包括 Double.POSITIVE_INFINITY)。此方法认为 0.0d 大于 -0.0d。这确保了此方法强加的 Double 对象的自然排序与 equals 一致。

public static void main(String[] args) {
  Double d = new Double(Double.NaN);
  System.out.println(d.compareTo(Double.NaN) == 0);//returns true
}
于 2013-01-30T12:58:11.690 回答