0

先週頃から、通常は作業中の Rails プロジェクトが BigDecimal.to_f に関して動作がおかしくなり始めました。to_f を呼び出すと、すべての BigDecimal 数値が 0.0 として出力されます。

~/development/rails_project> rails c
Loading development environment (Rails 3.2.9)
1.9.3p194 :001 > BigDecimal.new('5').to_f
 => 0.0 

いつものように、Ruby 1.9.3 パッチ レベル 194 と Rails 3.2.9 を実行しています。同じバージョンを使用して同じプロジェクトに取り組んでいる一部の同僚には、この問題はありません。

Ruby 1.9.3 パッチ レベル 362 で試しても同じ結果でした。誰かが同じ問題を抱えていて、それを克服する方法を知っていますか?

ありがとう。

編集:

私の問題は to_s 関数ではなく、to_f にあります。私の問題は number_to_currency にあるため、単純化しすぎた可能性があります。

~/development/rails_project> rails c
Loading development environment (Rails 3.2.9)
1.9.3p194 :001 > include ActionView::Helpers::NumberHelper
 => Object 
1.9.3p194 :002 > BigDecimal.new('5').to_s('F')
 => "5.0" 
1.9.3p194 :003 > BigDecimal.new('5').to_s
 => "5.0" 
1.9.3p194 :004 > BigDecimal.new('5').to_f
 => 0.0 
1.9.3p194 :005 > number_to_currency(5)
 => "€ 0,00"

number_with_precisionいくつかのデバッグを行って、メソッド、より正確には次の行に絞り込みました。

rounded_number = BigDecimal.new(number.to_s).round(precision).to_f

この行のさまざまな部分を出力すると、次の結果が得られます。

number = 5.0
number.to_s = "5.0"
precision = 2
BigDecimal.new(number.to_s) = 5.0
BigDecimal.new(number.to_s).round(precision) = 5.0
BigDecimal.new(number.to_s).round(precision).to_f = 0.0

どんな手掛かり?

4

1 に答える 1

0

暗闇の中でのショット: これは、Ruby/Rails コンソールのロケール依存のフォーマットの問題である可能性があります。

これを試して:

BigDecimal.new('5').to_s('F')  # Should be "5.0"
BigDecimal.new('5').to_i       # Should be 5

これが期待どおりの結果を出力する場合、それはコンソールのフォーマットの問題です。to_fメソッドは実際には正しい結果を返しますが、コンソールは結果を出力するために結果に対して別のメソッドを呼び出しto_sます。その場合、 で問題を再現できるはずです5.to_f

于 2013-01-08T10:41:30.673 に答える