From 这个问题 https://stackoverflow.com/questions/471296/how-can-while-i-i-be-a-non-infinite-loop我了解到 Double.NaN 不等于其自身。
我正在为自己验证这一点,并注意到如果将 Double.NaN 包装在 Double 实例中,则情况并非如此。例如:
public class DoubleNaNTest {
public static void main(String[] args) {
double primitive = Double.NaN;
Double object = new Double(primitive);
// test 1 - is the primitive is equal to itself?
boolean test1 = primitive == primitive;
// test 2 - is the object equal to itself?
boolean test2 = object.equals(object);
// test 3 - is the double value of the object equal to itself?
boolean test3 = object.doubleValue() == object.doubleValue();
System.out.println("Test 1 = " + test1);
System.out.println("Test 2 = " + test2);
System.out.println("Test 3 = " + test3);
}
}
Outputs:
Test 1 = false
Test 2 = true
Test 3 = false
在我看来,所有三个测试都应该评估为 false,因为所有三个操作都是等效的(如果您使用 Double.NaN 之外的其他东西,它们就是这样)。
有人可以解释一下这是怎么回事吗?
正在发生的事情是equals
方法故意偏离 IEE 浮点。引用 Javadoc 中的equals(Object)
的方法java.lang.Double http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Double.html.
但是,有两个例外:
- 如果d1和d2都表示Double.NaN,则equals方法
返回 true,即使
Double.NaN==Double.NaN 有值
错误的。
- 如果 d1 代表 +0.0,而 d2 代表 -0.0,反之亦然,则
equal test 的值为 false,即使
尽管 +0.0==-0.0 的值为 true。
这个定义允许哈希表
正常操作。
结果是,如果您想要 100% IEEE 浮点兼容性,您需要显式取消装箱java.lang.Double
实例并比较结果double
values.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)