質問

として Ordered trait 要求、 equals Scala のメソッド BigDecimal クラスは順序と一致しています。ただし、ハッシュコードはラップされたものから単純に取得されます。 java.math.BigDecimal したがって、equals と矛盾します。

object DecTest {
  def main(args: Array[String]) {
    val d1 = BigDecimal("2")
    val d2 = BigDecimal("2.00")
    println(d1 == d2) //prints true
    println(d1.hashCode == d2.hashCode) //prints false
  }
}

これが既知の問題であるという言及は見つかりません。何かが足りないのでしょうか?

役に立ちましたか?

解決

Scalaのユーザーメーリングリストの人を超えるが、これはバグであることに同意するように見えます。私は、誰が今までハッシュ構造でキーとしてBigDecimalを使用していないので、それは今までピックアップされていないと思います。これはバグ#2304

として提出されています

他のヒント

アップデート: この答えは間違っています!なぜそれが間違っているのかを理解するのにコメントが役立つと思うので、それを残しておきます。


これは違反の例ではありません equals/hashCode 契約。かどうかを確認する必要があります d1.equals(d2) それを証明するには等しいです。本当に、 d1.equals(d2) falseを返します。なぜ?

それは、「2」は「2.00」とまったく同じではないからです。右側の値には有効数字が多くなります。言い換えれば、それらは等しいです 価値 (2 == 2.00) ですが、次の点が異なります。 規模 (0 != 2).

ソースコードを読むと ここ, 、2 つの数値については、Java に分類されることがわかります。 BigDecimal equals 実装。次に、これを読むと、 Java ドキュメント これがどのように機能するかについて詳しく説明します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top