Ruby 1.8.6 BigDecimal.to_f всегда возвращает «0,0» в Solaris - PullRequest
0 голосов
/ 11 ноября 2009

Я столкнулся с очень странной ошибкой. Я на Solaris 10, использую Ruby Enterprise Edition (ruby 1.8.6 (2008-08-08 patchlevel 286) [i386-solaris2.10]) с Rails 2.3.4. У меня очень странная ошибка. В ирб:

irb(main):001:0> require 'bigdecimal'
=> true
irb(main):002:0> b = BigDecimal.new('123')
=> #<BigDecimal:834d0e8,'0.123E3',4(8)>
irb(main):003:0> b.to_s
=> "0.123E3"
irb(main):004:0> b.to_i
=> 123
irb(main):005:0> b.to_f
=> 123.0
irb(main):006:0> 

Все хорошо! НО, когда я запускаю консоль Rails и делаю то же самое, «to_f» всегда возвращает «0,0».

>> b = BigDecimal.new('123')
=> #<BigDecimal:9e80e14,'0.123E3',4(8)>
>> b.to_s
=> "123.0"
>> b.to_i
=> 123
>> b.to_f
=> 0,0

Этого не происходит, когда я делаю то же самое на моем Mac. Очень странно! Возможно, это ошибка в Ruby Enterprise Edition? Но если так, почему это не происходит с irb (который также является версией REE, я дважды проверил). Есть идеи?

  • Johannes

1 Ответ

1 голос
/ 11 ноября 2009

Я не эксперт, но я думаю, что такое поведение является побочным эффектом вашего пребывания в Германии.

Очевидно, to_f использует национализированную версию десятичного разделителя. Я подозреваю, что если вы измените настройки национальности вашего компьютера на США, это изменится.

EDIT:

Не то чтобы это помогло вашей проблеме. Но немного больше справочной информации может:

Когда вы делаете 123.to_f в irb, вы фактически выполняете 123.to_f.to_s (потому что irb должен распечатать ваш результат).

Возможно, вам лучше использовать явное форматирование с использованием оператора форматирования %:

"%5.1f" % 123 => 123.0

EDIT:

После некоторых копаний, нашел действительно актуальную и полезную информацию здесь:

http://rubyforge.org/forum/forum.php?thread_id=32460&forum_id=723

Это проблема, которая известна в сообществе Ruby, но не будет исправлена ​​как таковая. Обходные пути предоставляются в потоке.

...