Ruby on rails 将字符串转换为浮点或十进制有时会导致长精度
我有一个字符串要转换为十进制。Ruby on rails 将字符串转换为浮点或十进制有时会导致长精度,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我有一个字符串要转换为十进制。 例如 在大多数情况下,它会转换为0.07,但有时会转换为0.07000000000000001。为什么? 如果有帮助,当我在DB中插入此值时查看日志,这是相关部分: ["tax_rate", #<BigDecimal:7f9b6221d7c0,'0.7000000000 000001E-1',18(45)>] [“税率” 希望这对某些人来说是有意义的 免责声明: 我感觉有人会问我为什么要这样做。 我创建了一个简单的设置模型,用户可以在其中更新一些全
例如 在大多数情况下,它会转换为
0.07
,但有时会转换为0.07000000000000001
。为什么?
如果有帮助,当我在DB中插入此值时查看日志,这是相关部分:
["tax_rate", #<BigDecimal:7f9b6221d7c0,'0.7000000000 000001E-1',18(45)>]
[“税率”
希望这对某些人来说是有意义的
免责声明:我感觉有人会问我为什么要这样做。
我创建了一个简单的设置模型,用户可以在其中更新一些全局设置。
设置
模型有名称
、值
和变量类型
列。值
列是一个字符串。根据var\u type
列的值,我使用助手方法以适当的格式检索值。我无法解释原因,但我可以告诉您如何避免在处理数字时遇到此类问题:使用有理数
以下是文件:
如前所述,有理数始终会给出您想要的确切数字,从而避免舍入错误
从文档:
10.times.inject(0){|t,| t + 0.1} #=> 0.9999999999999999
10.times.inject(0){|t,| t + Rational('0.1')} #=> (1/1)
如果这能解决您的问题,请告诉我。:)
10.times.inject(0){|t,| t + 0.1} #=> 0.9999999999999999
10.times.inject(0){|t,| t + Rational('0.1')} #=> (1/1)