作为 Ordered trait 需求, equals 方法上的卡拉 BigDecimal 类是一致的,排序。然而,哈希码是简单地采取从包裹 java.math.BigDecimal 因此不符合平等的。

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
  }
}

我找不到任何参照这是一个已知的问题。我失去了一些东西?

有帮助吗?

解决方案

斯卡拉用户邮件列表上的人过来似乎都认为这是一个错误。我想这不是被拾起到现在为止,因为没有人曾经使用BigDecimal作为哈希结构的关键。它已经日提交的作为错误#2304

其他提示

更新: 这个答案是错的!我离开是因为我认为该意见是有用的,看到它为什么是错误的。


这不是一个示例的违反的 equals/hashCode 合同。你会需要检查是否 d1.equals(d2) 等于证明这一点。事实上, d1.equals(d2) 返回错误的。为什么?

这是因为"2"是不准确的同样的事情,因为"2.00";值上的权利具有更显着的位数。换句话说,他们是平等的 (2==2.00),但不同 规模 (0 != 2).

如果你读的源代码 在这里,, 你可以看到,这两个数字,它通过Java BigDecimal equals 执行情况。然后读取 Java文件 介绍了如何运作的更详细的说明。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top