2009-08-28 64 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