2010-06-08 6 views
0

Je courais:flotteur Mauvais Ruby et le résultat de soustraction BigDecimal

[~/ruby/rails/sas]$ ruby --version 
ruby 1.8.7 (2009-06-08 patchlevel 173) [universal-darwin10.0] 

sur Mac Snow Leopard 10.6.3

peut-elle aider quelqu'un pour expliquer pourquoi la soustraction et Float BigDecimal peut être ce mal.

[~/ruby/rails/sas]$ console 
Loading development environment (Rails 2.1.1) 
>> num = 30.0 
=> 30.0 
>> num.class 
=> Float 
>> ex = 28.04.to_d 
=> #<BigDecimal:105367e40,'0.284E2',8(8)> 
>> ex.class 
=> BigDecimal 
>> num - ex 
=> 1.6 
>> _.class 
=> Float 
>> 

J'espérais que le résultat devrait être 1.96, je sais que peut-être faire une opération arithmétique en utilisant 2 différents types de données ne sont pas recommandés, mais ce comportement est si étrange.

Il semble sage que désormais, je dois vérifier le type de données de variables avant de faire n'importe quelle opération arithmétique.

J'espère que quelqu'un pourra me donner un aperçu de ce qui se passe.

+1

Ce n'est pas causée par le mélange de deux types. De la sortie "# " on peut voir que votre variable ex a la valeur 28.4, le problème doit survenir dans la fonction to_d. Je ne peux pas donner plus d'informations car je ne peux pas reproduire votre problème. –

Répondre

0

Le problème est pas rails 2.1.1, puisque j'ai essayé avec des rails 2.3.8 avec le même résultat

[~/ruby/rails/sample_2.3.8]$ script/console 
Loading development environment (Rails 2.3.8) 
>> BigDecimal("28.04") 
=> #<BigDecimal:1033eccc8,'0.284E2',8(8)> 
>> 

Je suis très sûr que le problème est Ruby 1.8.7 P173 qui est livré en standard avec snow Leopard 10.6.3 telle que publiée ici:

http://redmine.ruby-lang.org/issues/show/1910

3

C'est le problème avec la méthode to_d dans Rails 2.1.1. J'ai essayé avec

ex = BigDecimal.new '28.04' 
#=> #<BigDecimal:1209328,'0.2804E2',8(8)> 

et avec Rails 2.3.5

ex = 28.04.to_d 
#=> #<BigDecimal:219ea18,'0.2804E2',8(8)> 

et num - ex # => 1,96

a bien fonctionné

Vous disposez de trois options soit mise à niveau votre version rails ou remplacer la méthode to_d ou simplement utiliser BigDecimal.new '28.04' au lieu de to_d

Questions connexes