BigDecimal to_s не соответствует to_f - PullRequest
3 голосов
/ 02 апреля 2010

Не сломан ли класс BigDecimal? Кажется, что никогда не должно происходить следующее: Обратите внимание, что a.to_f! = A.to_s.to_f

класс 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

Есть идеи, что может пойти не так? Мы запускаем ruby ​​1.8.7p72 на наших серверах и 1.8.7p173 на наших локальных машинах.

Ответы [ 2 ]

1 голос
/ 03 апреля 2010

Если вы используете Mac OS X 10.6.3, это может быть объяснением: http://www.abletech.co.nz/2010/03/osx-10-6-3-installs-new-ruby-with-faulty-bigdecimal/

Чтобы избавиться от проблемы, вы можете использовать RVM .

0 голосов
/ 02 апреля 2010

Как документы говорят:

to_f

Возвращает новый объект Float, имеющий примерно то же значение, что и число BigDecimal. Применяются нормальные пределы точности и встроенные ошибки двоичной арифметики с плавающей точкой.

Это означает, что Float в ruby ​​везде ведет себя как float: http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

Не каждый номер представлен поплавком. В таких случаях число округляется.

...