2009-08-27 12 views
3

À quoi sert l'opérateur de division sur un scala BigDecimal?Scala BigDecimal division

val d1 = BigDecimal(2) 
val d2 = BigDecimal(3) 
val div = d1/d2 //throws ArithmeticException: non-terminating decimal expansion 

Pour que cela fonctionne, vous devez définir un contexte DECIMAL128 sur les décimales. Malheureusement, la seule façon que je peux voir de faire ceci est:

val div = new BigDecimal(d1.bigDecimal.divide(d2.bigDecimal, MathContext.DECIMAL128)) //OK! 

Mais c'est juste un gâchis! Est-ce que je manque quelque chose?

Répondre

7

Ceci est un bogue connu dans Scala -> voir Ticket #1812. Apparemment, il est corrigé dans Scala 2.8. Vous pouvez également télécharger un correctif du rapport de bug qui implémente un BigDecimal associé à un MathContext. Utilisation de la donnée Decimal.scala, je peux écrire quelque chose comme ça et le faire fonctionner sans erreur:

val d1 = Decimal128(1) 
val d2 = Decimal128(3) 
val d3 = d1/d2 // works, gives a truncated result 

Par conséquent, vous pouvez soit compiler le fichier Decimal.scala donné et l'ajouter à votre classpath ou attendre Scala 2.8, qui sera l'ont déjà dans la bibliothèque standard.

EDIT Voir revision 18021 de la bibliothèque standard Scala pour les modifications apportées à BigDecimal implémentant cela.

Hope it helps :)

-- Flaviu Cipcigan

+0

C'est une excellente réponse, merci Flaviu –