2

我想比较两个双值如下:

Double doubleValue = Double.valueOf(Long.MAX_VALUE);

Double doubleValue2 = Double.valueOf(Long.MAX_VALUE+1d);

显然 doubleValue 和 doubleValu2 不相等,由于 1d 加法,2nd 更大。

但无论我使用 compare() 还是 equals() 方法,这两种方法都会为两个值返回相等的结果。有什么方法可以比较并且不会在这里丢失准确性。

提前致谢。

4

2 回答 2

4

这是因为在将 long 转换为 double 时会丢失精度

    double d1 = (double)Long.MAX_VALUE;
    double d2 = Long.MAX_VALUE + 1.0;
    System.out.println(d1);
    System.out.println(d2);

它给出了相同的数字

9.223372036854776E18
9.223372036854776E18

long 有 32 位,double 的有效位有 53 位http://en.wikipedia.org/wiki/Double-precision_floating-point_format。十进制,max long = 9223372036854775807,是19位,double最多可以容纳17位

于 2013-01-07T03:14:30.743 回答
1

Long.MAX_VALUE 有 63 个有效位。double 不能准确表示任何超过 53 个有效位的数字。如果您想使用大于 Long.MAX_VALUE 的整数进行精确计算,我建议使用 java.math.BigInteger。

import java.math.BigInteger;

public class Test {
  public static void main(String[] args) {
    BigInteger longMax = BigInteger.valueOf(Long.MAX_VALUE);
    BigInteger plusOne = longMax.add(BigInteger.ONE);
    System.out.println(longMax.equals(plusOne));
  }
}
于 2013-01-07T03:09:13.243 回答