不卡拉的BigDecimal违反平等/哈希码合同?
-
20-09-2019 - |
题
作为 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文件 介绍了如何运作的更详细的说明。
不隶属于 StackOverflow