3

根据Ordered trait需求,equalsScalaBigDecimal类上的方法与顺序一致。但是,哈希码只是从包装中获取的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 用户邮件列表上的人似乎同意这是一个错误。我猜它直到现在才被拾起,因为没有人使用 aBigDecimal作为哈希结构中的键。它已被归档为错误 #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)。

如果您阅读此处的源代码,您可以看到对于两个数字,它属于 JavaBigDecimal equals实现。然后,阅读Java 文档更详细地描述了它是如何工作的。

于 2009-08-28T08:18:04.467 回答