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



下面我尝试将最大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

最新更新