2

下面我尝试分配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声明无法检测到这一点吗?

真诚的感谢。

4

2 回答 2

4

Long.MAX_VALUE不能完全表示为双精度。最接近的可用双精度值是9223372036854775808

添加Double.MIN_VALUE到该数字 (10^-1074) 不会改变任何内容,因为最接近的 double 值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);
于 2012-09-10T16:37:19.513 回答
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
于 2012-09-10T16:34:50.563 回答