从上周开始,我的平常工作的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
有任何线索吗?
答案 0 :(得分: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
重现问题。