3

Ordered trait要求に応じて、ScalaのクラスのメソッドequalsBigDecimal順序と一致しています。ただし、ハッシュコードはラップされたものから取得されるだけな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
  }
}

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

4

2 に答える 2

7

Scala Userメーリングリストに参加している人々は、これがバグであることに同意しているようです。BigDecimalハッシュ構造のキーとして誰も使用したことがないので、これまで取り上げられていなかったと思います。バグ#2304として提出されまし

于 2009-08-28T09:01:21.790 に答える
0

更新:この答えは間違っています!コメントはなぜそれが間違っているのかを理解するのに役立つと思うので、私はそれを残しました。


equalsこれは/hashCode契約違反の例ではありません。d1.equals(d2)あなたはそれを証明するために等しいかどうかをチェックする必要があるでしょう。そして確かに、d1.equals(d2)falseを返します。なんで?

これは、「2」が「2.00」とまったく同じではないためです。右側の値には有効数字があります。つまり、は同じですが(2 == 2.00)、スケールは異なります(0!= 2)。

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

于 2009-08-28T08:18:04.467 に答える