2010-04-01 5 views
3

La classe BigDecimal est-elle brisée? Il semble que ce qui suit devrait jamais, jamais se produire: Notez que a.to_f = a.to_s.to_fBigDecimal to_s ne correspond pas à

a.class => BigDecimal

a.to_f => 18658,1072928!

a.to_s => "10865,81072928"

b.class => BigDecimal

b.to_f => 10000.0

b.to_s => "10000.0"

(a - b) .to_f => 865,81072928

a.to_f - b.to_f => 8658.1072928

Toutes les idées sur ce qui pourrait aller mal? Nous courons ruby ​​1.8.7p72 sur nos serveurs et 1.8.7p173 sur nos machines locales.

+0

comment et où définissez-vous vos variables a et b. ps: pas de problème avec Ruby 1.8.6 – fl00r

Répondre

0

Comme le disent docs:

to_f:

Renvoie un nouvel objet flotteur ayant à peu près la même valeur que le nombre BigDecimal. Les limites de précision normales et les erreurs intégrées de l'arithmétique Float binaire s'appliquent.

Cela signifie que Float en rubis se comporte comme un flotteur partout: http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

Non chaque numéro est représentable par un flotteur. Dans ce cas, le nombre est arrondi.

+0

a.to_f => 18658,1072928 a.to_s => « 10865,81072928 » Je ne pense pas que nous pouvons blâmer une différence de près de 8000 en cas d'erreur ... –

+0

roundoff Vous êtes droite. J'ai également testé sur ma machine locale (je cours aussi 1.8.7p173) et les résultats sont différents: >> a = BigDecimal.new ('10865.81072928') => # >> a.to_s => "0.186581072928E5" >> a.to_f => 18658,1072928 Aucune idée pourquoi ... –

Questions connexes