ruby 1.9.3-p194 rails 3.2.9 BigDecimal to_f总是输出0.0

时间:2013-01-08 10:31:54

标签: ruby-on-rails ruby ruby-on-rails-3.2 bigdecimal

从上周开始,我的平常工作的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

有任何线索吗?

1 个答案:

答案 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重现问题。