2

value以下では、最大値を割り当ててから、可能なLong最小の正のDouble値を追加しようとしています。

次に、値が最大値より大きいことを検出しようとしLongます。

Double value = new Long(Long.MAX_VALUE).doubleValue();
value += Double.MIN_VALUE;
if (value < -(new Long(Long.MAX_VALUE).doubleValue()) || value > new Long(Long.MAX_VALUE).doubleValue()) {
  // Expecting code here to execute, but it doesn't.
}

関連する値を調査するとvalue、の最終的な値は次のようになります。

9.223372036854776E18
= 9223372036854776000

値をLong.MAX_VALUE持っている間

9223372036854775807

これらのショーを比較するとvalue、予想どおりに大きくなります。

9223372036854776000 (value)
9223372036854775807 (Long.MAX_VALUE)

ifステートメントがこれを検出できない理由を誰かが説明できますか?

心から感謝します。

4

2 に答える 2

4

Long.MAX_VALUEダブルとして正確に表すことはできません。最も近い利用可能なdouble値は9223372036854775808です。

その数値(10 ^ -1074)に追加しても、 stillDouble.MIN_VALUEに最も近いdouble値は。であるため、何も変更されません。9223372036854775808 + 10^-10749223372036854775808

@PeterLawreyのコードを使用すると、次に使用可能なdoubleが9223372036854777856(に等しいLong.MAX_VALUE + 2048)であることがわかります。

注:doubleは実際にはに等しく9223372036854775808、これは。として出力9.223372036854776E18れます。次のコードでそれを見ることができます:

double d = Long.MAX_VALUE;
BigDecimal bd= new BigDecimal(d);
System.out.println(bd);
于 2012-09-10T16:37:19.513 に答える
3

非常に小さい値を大きい値に追加することは、何も追加しないことと同じです。

あなたが考えていたのは

double d = Long.MAX_VALUE;
// get the next represented value.
double d1 = Double.longBitsToDouble(Double.doubleToLongBits(d)+1);
System.out.println(d > Long.MAX_VALUE);
System.out.println(d1 > Long.MAX_VALUE);

プリント

false
true
于 2012-09-10T16:34:50.563 に答える