5

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

NaN = "NaN" 代表“不是数字”。如果浮点运算具有一些导致运算产生一些未定义结果的输入参数,则会产生“Nan”。例如,0.0 除以 0.0 在算术上是未定义的。取负数的平方根也是未定义的。

我试图在 Java 中使用 NaN 常量

public class NaNDemo {
    public static void main(String s[]) {
        double x = Double.NaN;
        double y = Double.NaN;

        System.out.println((x == y));
        System.out.println("x=" + x);
        System.out.println("y=" + y);
    }
}

输出

false
x=NaN
y=NaN

那么为什么 x==y 是假的呢?

4

4 回答 4

3

NaN是一个概念,而不是一个值或一个数字。由于该概念可以表示多个非实数值(虚数、0/0 等),因此说任何特定的 NaN 等于任何其他 NaN 是没有意义的。

同样,您不能说Double::NEGATIVE_INFINITY等于自身,因为无穷大也不是数字。

于 2012-09-28T04:12:11.197 回答
1

如果任一操作数为 NaN,则相等运算符 == 返回 false。

JSL谈到 NaN:

  • 如果一个或两个操作数都是 NaN,则数值比较运算符 <、<=、> 和 >= 返回 false(第 15.20.1 节)。
  • 如果任一操作数为 NaN,则相等运算符 == 返回 false。
  • 特别是,如果 x 或 y 为 NaN,则 (x=y) 将为假。
  • 如果任一操作数为 NaN(第 15.21.1 节),则不等式运算符 != 返回 true。

特别是,当且仅当 x 为 NaN 时 x!=x 为真。

于 2012-09-28T04:13:15.933 回答
0

NaN - 非数字在使用 NAN 数字进行操作时没有任何意义。所以不能相等。

于 2012-09-28T04:21:01.140 回答
0

两个NaN值不能彼此相等..您不知道它们代表什么未定义的值..而且您也不知道它们是如何表示的..

正如JLS所引用的-

特殊数字NaN (not-a-number)是无序的,具有以下字符:

  • 如果一个或两个操作数都是 NaN,则数值比较运算符 <、<=、> 和 >= 总是返回 false。
  • 如果任一操作数为 NaN,则相等运算符 == 返回 false。
  • 如果任一操作数为 NaN,则不等式运算符 != 返回 true。

如果你这样定义它们: -

    Double a = new Double(Double.NaN);
    Double b = new Double(Double.NaN);

    if (a == b) {
        System.out.println("true");   /** You will get true **/
    }
于 2012-09-28T04:11:16.807 回答