2

次のように2つのdouble値を比較したい:

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

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

どうやら doubleValue と doubleValu2 は等しくなく、1d の追加により 2nd の方が大きくなっています。

しかし、compare() または equals() メソッドを使用しても、どちらのメソッドも 2 つの値に対して等しい結果を返します。ここで精度を落とさずに比較できる方法はありますか。

前もって感謝します。

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です。10 進数では、最大 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 に答える