Неправильный результат вычитания Ruby Float и BigDecimal - PullRequest
0 голосов
/ 08 июня 2010

Я бегу:

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

на Mac Snow Leopard 10.6.3

Может кто-нибудь помочь объяснить, почему вычитание Float и BigDecimal может быть таким неправильным.

[~/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
>> 

Я надеялся, что результат должен быть 1,96, я знаю, что, возможно, делать арифметическую операцию с использованием двух разных типов данных не рекомендуется, но это странное поведение.

Кажется, что мудрос этого момента я должен проверять тип данных переменных, прежде чем выполнять какую-либо арифметическую операцию.

Надеюсь, кто-нибудь сможет дать мне представление о том, что происходит.

Ответы [ 2 ]

3 голосов
/ 08 июня 2010

Это проблема с методом to_d в Rails 2.1.1. Я пробовал с

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

и с рельсами 2.3.5

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

и num - ex # => 1,96

работал нормально

Таким образом, у вас есть три варианта: либо обновить версию rails, либо переопределить метод to_d, либо просто использовать BigDecimal.new '28.04' вместо to_d

0 голосов
/ 09 июня 2010

Проблема в , а не rails 2.1.1, так как я пытался с рельсами 2.3.8 с тем же результатом

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

Я уверен, что проблема в Ruby 1.8.7 p173, который входит в стандартную комплектацию Snow Leopard 10.6.3, как указано здесь:

http://redmine.ruby -lang.org / Issues / Show / 1910

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...