如 Java 语言规范中所述“如果两个操作数之一或两个操作数均为 NaN,则数字比较运算符 <, <=, > 和 >= 返回 false” 所以我正在比较两个 NAN。 为什么当我比较两个 NAN 时它在控制台中打印 true?
double f = 3/0.0d;
double h = 2/0.0d;
System.out.println((f>=h));
f 和 h 都是 NAN,当我比较它们时,我期望打印 false,但我的输出为 true。
盗贼 已经解释得很好了:
因为
和f
的值不是h
,而是无穷大!NaN
是Double.NaN == Double.NaN
,但是false
是Double.POSITIVE_INFINITY == Double.POSITIVE_INFINITY
。true
除了此注释之外,您还应该知道
NaN
表示无效操作的结果,例如0/0.0d
,Math.sqrt(-1)
等。因此,以下语句将打印false
:
System.out.println(0 / 0.0d == Math.sqrt(-1));
2.0/0 不会产生 NaN:
System.out.println(2.0/0.0);
> Infinity
双精度数有 3 个“非数字”值:
根据规范,正无穷大等于正无穷大,负无穷大等于负无穷大。只有 NaN 不等于其自身。
我们可以得到 NaN:
double nan = 0.0 / 0.0;
System.out.println(nan);
System.out.println(nan == nan);
> NaN
> false
如果你确实需要 NaN 某处(例如你想返回它),最清晰的方法是
Double.NaN
。上面的示例简单地展示了如何自然地从计算中获得 NaN 值 - 最常见的方式是零除以零。其他一些方法:
double posInf = Double.POSITIVE_INFINITY;
double negInf = Double.NEGATIVE_INFINITY;
System.out.println(posInf - posInf); // NaN
System.out.println(posInf - negInf); // positive infinity
System.out.println(posInf / posInf); // NaN