2009-08-28 5 views
3

Comme le demande Orderedtrait, la méthode equals sur la classe BigDecimal de Scala est cohérente avec la commande. Cependant, le hashcode est simplement pris dans le java.math.BigDecimal enveloppé et est donc incompatible avec des égaux.Est-ce que BigDecimal de Scala viole le contrat 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 
    } 
} 

Je ne trouve aucune référence à ce problème étant connu. Est-ce que je manque quelque chose?

Répondre

7

Les personnes figurant sur la liste de diffusion des utilisateurs Scala semblent être d'accord pour dire qu'il s'agit d'un bug. Je suppose que cela n'a pas été pris jusqu'à présent parce que personne n'a jamais utilisé un BigDecimal comme clé dans une structure de hachage. Il a été filed as bug #2304

0

Mise à jour: Cette réponse est erronée! J'ai laissé tomber parce que je pense que les commentaires sont utiles pour voir pourquoi c'est faux.


Ce n'est pas un exemple d'une violation du contrat equals/hashCode. Vous devez vérifier si d1.equals(d2) est égal à le prouver. Et en effet, d1.equals(d2) renvoie false. Pourquoi?

C'est parce que "2" n'est pas exactement la même chose que "2,00"; la valeur sur la droite a des chiffres plus significatifs. En d'autres termes, ils sont égaux en valeur (2 == 2.00), mais diffèrent en échelle (0! = 2).

Si vous lisez le code source here, vous pouvez voir que pour deux nombres, il tombe à travers l'implémentation Java BigDecimalequals. Ensuite, en lisant le Java documentation décrit comment cela fonctionne plus en détail.

+2

Celui qui est upvoting cela doit aller lire sur Scala! '==' dans Scala est équivalent à '.equals' dans Java. ** Cette réponse est fausse ** –

+0

* @ John * - as-tu essayé d'exécuter ta réponse dans Scala? Ce n'est pas correct! 'scala.BigDecimal' et' java.math.BigDecimal' sont des choses différentes –

+0

* @ John * - désolé de carpe: si vous suivez votre lien, vous pouvez voir que la méthode 'equals' passe à Java' BigDecimal.compare 'méthode –

Questions connexes