簡體   English   中英

我應該如何將Double值與Long.MAX_VALUE進行比較? 和Long.MAX_VALUE + 1d

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM