我想比较两个双值如下:
Double doubleValue = Double.valueOf(Long.MAX_VALUE);
Double doubleValue2 = Double.valueOf(Long.MAX_VALUE+1d);
显然doubleValue和doubleValu2不相等,由于1d的加法,2nd更大。
但无论我使用compare()还是equals()方法,两种方法都会为两个值返回相同的结果。有什么方法可以比较,而不是在这里失去准确性。
提前感谢。
答案 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));
}
}