2010-01-13 5 views
8

Lors de l'écriture d'un test avec une valeur qui est représentée comme BigDecimal, j'ai rencontré quelque chose de bizarre et j'ai décidé de creuser dedans. En bref, '0.00009', arrondi à deux décimales, est renvoyé à 0.01 au lieu de 0.00. Vraiment. Voici mon script/capture de la console:Ruby BigDecimal Round: Est-ce une erreur?

>> bp = BigDecimal('0.09') 
=> #<BigDecimal:210fe08,'0.9E-1',4(8)> 
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f 
=> 0.09 
>> bp = BigDecimal('0.009') 
=> #<BigDecimal:210bcf4,'0.9E-2',4(8)> 
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f 
=> 0.01 
>> bp = BigDecimal('0.0009') 
=> #<BigDecimal:2107a8c,'0.9E-3',4(12)> 
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f 
=> 0.0 
>> bp = BigDecimal('0.00009') 
=> #<BigDecimal:2103428,'0.9E-4',4(12)> 
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f 
=> 0.01 
>> bp = BigDecimal('0.000009') 
=> #<BigDecimal:20ff0f8,'0.9E-5',4(12)> 
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f 
=> 0.0 

Oh, et je reçois les mêmes résultats si j'utilise le mode par défaut, comme ceci:

>> bd = BigDecimal('0.00009') 
=> #<BigDecimal:2152ed8,'0.9E-4',4(12)> 
>> bd.round(2).to_f 
=> 0.01 

Voici mes versions:

ruby 1.8.6 (2008-03-03 patchlevel 114) [i686-darwin9.2.2] 
Rails 2.3.4 

Est-ce que quelqu'un a déjà vu quelque chose comme ça?

+0

Je ne peux pas le reproduire dans mon environnement 1.8.7 (ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux]) – bryantsai

Répondre

6

Non, je n'ai jamais vu ça auparavant, et ça ressemble vraiment à un bug. 0.00009 arrondi à deux décimales devrait certainement être 0.00.

Le ROUND_HALF_DOWN ne devrait pas changer le comportement puisque vous n'avez pas affaire à des valeurs intermédiaires.

This link a plus de détails.

Cela semble être un bug dans les niveaux 1.8 qui a été corrigé en 1.9. C'est un peu bizarre en ce sens qu'il semble seulement affecter les nombres avec un nombre pair de zéros avant le premier chiffre différent de zéro et seulement si ce chiffre est 5 ou plus grand.

Cela semble être exactement votre problème en fonction des données fournies.

+0

Oui, cela semble être exactement mon problème! Merci pour le sleuthing! –

0

Je pense que c'est un bug aussi, mais ce que je m'interroge, c'est le .to_f pour afficher le résultat. Avec BigDecimal, vous devriez utiliser .to_s ('F') car je suppose que vous avez une raison d'utiliser BigDecimal au lieu de Floats.