[英]how should I compare Double value with Long.MAX_VALUE? and Long.MAX_VALUE+1d
我想比較兩個double值,如下所示:
Double doubleValue = Double.valueOf(Long.MAX_VALUE);
Double doubleValue2 = Double.valueOf(Long.MAX_VALUE+1d);
顯然doubleValue和doubleValu2不相等,由於1d加法,第二個較大。
但是無論我使用compare()還是equals()方法,這兩個方法對於兩個值都返回相等的結果。 有什么我可以比較並且在這里不會丟失准確性的方法。
提前致謝。
這是因為在將長整型轉換為雙精度時會損失精度
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 。 以十進制表示,最大長度= 9223372036854775807,它是19位數字,並且double最多可以容納17個數字
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));
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.