Java 6 - 创建并检测Long.MAX_VALUE之上的第一个double值

时间:2012-09-10 16:31:19

标签: java casting double long-integer max

下面我尝试将最大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语句无法检测到这一点吗?

真诚的谢谢。

2 个答案:

答案 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