大约从上周开始,我通常工作的 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
有什么线索吗?