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 回答