将字符串转换为float或decimal有时会导致长精度

时间:2013-05-02 18:14:51

标签: ruby-on-rails ruby-on-rails-3

我有一个字符串,我想将其转换为小数 例如

tax_rate = "0.07"
tax_rate.to_d

在大多数情况下,它会转换为0.07,但有时会将其转换为0.07000000000000001。为什么呢?

如果有帮助,当我查看将此值插入数据库时​​的日志,这是相关部分:

["tax_rate", #<BigDecimal:7f9b6221d7c0,'0.7000000000 000001E-1',18(45)>]

希望这对某人有意义。

声明:
我有一种感觉,有人会问为什么我这样做。
我创建了一个简单的设置模型,用户可以在其中更新一些全局设置 Setting模型包含namevaluevar_typevalue列是一个字符串。我使用辅助方法以适当的格式检索值,具体取决于var_type列的值。

1 个答案:

答案 0 :(得分:1)

我无法解释为什么但我有机会告诉你如何避免在处理数字时遇到这种麻烦:使用理性。

以下是文档:http://ruby-doc.org/core-1.9.3/Rational.html

如上所述,理性总会给出您想要的确切数字,从而避免舍入错误。

来自doc:

10.times.inject(0){|t,| t + 0.1}              #=> 0.9999999999999999
10.times.inject(0){|t,| t + Rational('0.1')}  #=> (1/1)

如果这可以解决您的问题,请告诉我。 :)