13

なぜ次のことが起こるのか、私は本当に頭を悩ませることができます:

Double d = 0.0;
System.out.println(d == 0); // is true
System.out.println(d.equals(0)); // is false ?!

ただし、これは期待どおりに機能します。

Double d = 0.0;
System.out.println(d == 0.0); // true
System.out.println(d.equals(0.0)); // true

これが何らかの形でオートボクシングに関連していることは確かですが、演算子が使用されているときと呼び出されたときに、なぜ0ボックス化が異なるの==.equalsか本当にわかりません。

これは暗黙のうちにequals契約に違反していませんか?

  * 再帰的です: null 以外の参照値の場合
  * x, x.equals(x) は返す必要があります
  * 真実。

編集

速い答えをありがとう。私はそれが異なって箱に入れられていると考えました.本当の問題は:なぜそれが異なって箱に入れられているのですか? これは、直感的で予想されるd == 0dよりも直感的であるということですが、「直感的に」よりもそうであると思われる場合も同様です。d.equals(0d)d == 0Integertrued.equals(0)

4

5 に答える 5

5

次のように浮動小数点数を比較する必要があることに注意してください。

|x - y| < ε, ε very small
于 2011-06-29T10:00:56.300 に答える
2

あなたが実行するとき

d == 0

これはアップキャストです

d == 0.0

ただし、オートボクシングのアップキャストルールはなく、equals(Object)があったとしても、整数ではなくダブルが必要なヒットはありません。

于 2011-03-08T10:07:46.490 に答える