下面我尝试将最大Long
值分配给value
,然后将最小正Double
值添加到其中。
然后,我尝试检测该值是否大于最大Long
值。
Double value = new Long(Long.MAX_VALUE).doubleValue();
value += Double.MIN_VALUE;
if (value < -(new Long(Long.MAX_VALUE).doubleValue()) || value > new Long(Long.MAX_VALUE).doubleValue()) {
// Expecting code here to execute, but it doesn't.
}
研究所涉及的值表明,value
具有的最终值
9.223372036854776E18
= 9223372036854776000
而CCD_ 6具有值
9223372036854775807
比较这些表明value
如预期的那样更大:
9223372036854776000 (value)
9223372036854775807 (Long.MAX_VALUE)
有人能解释一下为什么if
语句无法检测到这一点吗?
衷心感谢。
Long.MAX_VALUE
不能精确地表示为双精度。最接近的可用双值是9223372036854775808
。
将Double.MIN_VALUE
添加到该数字(10^-1074)不会改变任何内容,因为与9223372036854775808 + 10^-1074
最接近的双值仍然是9223372036854775808
。
使用@PeterLawrey的代码,您可以看到下一个可用的double是9223372036854777856
(等于Long.MAX_VALUE + 2048
)。
注意:您的double实际上等于9223372036854775808
,它被打印为9.223372036854776E18
。你可以用以下代码看到它:
double d = Long.MAX_VALUE;
BigDecimal bd= new BigDecimal(d);
System.out.println(bd);
将一个非常小的值添加到一个大的值中等同于什么都不添加。
我怀疑你想的是
double d = Long.MAX_VALUE;
// get the next represented value.
double d1 = Double.longBitsToDouble(Double.doubleToLongBits(d)+1);
System.out.println(d > Long.MAX_VALUE);
System.out.println(d1 > Long.MAX_VALUE);
打印
false
true