我应该如何将Double值与Long.MAX_VALUE进行比较?和Long.MAX_VALUE + 1d

时间:2013-01-07 03:04:34

标签: java comparison double

我想比较两个双值如下:

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

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

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

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

提前感谢。

2 个答案:

答案 0 :(得分:4)

这是因为在将长到两倍的转换时精度损失

    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 max

答案 1 :(得分:1)

Long.MAX_VALUE有63位有效位。双精度数不能精确表示超过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));
  }
}