从这个问题我学到了Double.NaN不等于它自己.
我正在为自己验证这一点,并注意到如果你在Double实例中包装Double.NaN则不是这种情况.例如:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Test 1 = false
Test 2 = true
Test 3 = false
Run Code Online (Sandbox Code Playgroud)
在我看来,所有三个测试都应该评估为false,因为所有三个操作都是等效的(因为如果你使用Double.NaN之外的其他东西).
有人能解释一下这里发生了什么吗?
Ste*_*n C 11
发生的事情是该equals方法故意偏离IEE浮点.从Javadoc引用java.lang.Double的equals(Object)方法.
但是,有两个例外:
- 如果d1和d2都表示Double.NaN,则equals方法返回true,即使Double.NaN == Double.NaN的值为false.
- 如果d1表示+0.0而d2表示-0.0,反之亦然,则
等值测试的值为false,即使
+0.0 == - 0.0的值为true.此定义允许哈希表正常运行.
结果是,如果您想要100%IEE浮点兼容性,则需要显式取消java.lang.Double实例化实例并比较结果double值.
| 归档时间: |
|
| 查看次数: |
2160 次 |
| 最近记录: |