下面我尝试将最大value
值分配给Long
,然后将可能的最小正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
而Long.MAX_VALUE
的值为
9223372036854775807
比较这些显示value
按预期更高的显示:
9223372036854776000 (value)
9223372036854775807 (Long.MAX_VALUE)
有人可以解释为什么if
语句无法检测到这一点吗?
真诚的谢谢。
答案 0 :(得分:4)
Long.MAX_VALUE
无法完全表示为double。最接近的可用双精度值为9223372036854775808
。
将Double.MIN_VALUE
添加到该数字(10 ^ -1074)不会改变任何内容,因为与9223372036854775808 + 10^-1074
最接近的双值仍为9223372036854775808
。
使用@PeterLawrey的代码,您可以看到下一个可用的双精度是9223372036854777856
(等于Long.MAX_VALUE + 2048
)。
注意:您的双倍实际上等于9223372036854775808
,其打印为9.223372036854776E18
。您可以使用以下代码查看它:
double d = Long.MAX_VALUE;
BigDecimal bd= new BigDecimal(d);
System.out.println(bd);
答案 1 :(得分:3)
将较小的值添加到较大的值与添加任何内容相同。
我怀疑你的想法是
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