2009-08-28 51 views
3

作为Orderedtrait的要求,斯卡拉的BigDecimal类上的equals方法与排序一致。但是,散列码仅取自包装的java.math.BigDecimal,因此与等号不一致。Scala的BigDecimal是否违反了equals/hashCode合约?

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

我找不到任何引用这是一个已知的问题。我错过了什么吗?

回答

7

Scala用户邮件列表上的人似乎同意这是一个错误。我想它到目前为止还没有被发现,因为没有人使用过BigDecimal作为散列结构中的关键字。这是filed as bug #2304

0

更新:这个答案是错误的!我已经把它留了下来,因为我认为这些评论对于看看它为什么是错误的是有用的。


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

这是因为“2”与“2.00”不完全相同;右边的值有更多有效数字。换句话说,它们在(2 == 2.00)相等,但比例(0!= 2)不同。

如果您阅读源代码here,您可以看到对于两个数字,它贯穿到Java实现的equals实现。然后,阅读Java documentation描述了如何更详细地工作。

+2

无论谁upvoting这需要去阅读有关斯卡拉! Scala中的'=='等同于Java中的'.equals'。 **这个答案是错误的** – 2009-08-28 08:44:35

+0

* @ John * - 您是否尝试过在Scala中运行您的答案?这是不正确的! 'scala.BigDecimal'和'java.math.BigDecimal'是不同的东西 – 2009-08-28 08:45:49

+0

* @ John * - 抱歉鲤鱼:如果你关注你的链接,你可以看到'equals'方法落入Java的'BigDecimal.compare '方法 – 2009-08-28 08:48:24