我正在阅读JLS8 4.2.3
,我找到Float NaN
和Double NaN
的概念。当我打开Float
和Double
类的源代码时,尝试了以下代码:
1st condition:
if (Float.NaN == Float.intBitsToFloat(0x7fc00000))
System.out.println("Both are equal");
}
2nd condition:
if (Float.NaN == (0.0f / 0.0)) {
System.out.println("Equal");
}
根据文件:NaN是
/**
* A constant holding a Not-a-Number (NaN) value of type
* {@code float}. It is equivalent to the value returned by
* {@code Float.intBitsToFloat(0x7fc00000)}.
*/
那么为什么我的两个条件都是false
。在2nd condition
的日食中,我得到了warning: Dead Code
。
与Double NaN
相同。
答案 0 :(得分:3)
这是因为根据定义,NaN不等于任何东西。它用于模拟某个东西,我们所知道的就是它不是一个数字。
想象一下:椅子是NaN,你的屏幕也是NaN(不是数字),但你的椅子与你的屏幕不一样。
同样地,鉴于简不是你的母亲而约翰不是你的母亲,坚持简和约翰必须是同一个人是毫无意义的。
答案 1 :(得分:2)
因为浮点将NaN == NaN
定义为false
。 (这是有道理的; 0/0
和acos(2)
都是NaN
,但这并不代表他们在任何有用的意义上彼此相等。)
使用Float.isNaN()
确定某些内容是否为NaN
。
答案 2 :(得分:2)
作为其他答案的补充,您可以使用以下任一方式测试float
是否为NaN:
Float.isNaN(myFloat);
或:
Float.compare(Float.NaN, myFloat) == 0
Double.NaN
也是如此;并且Double
类有类似的方法。