Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将字符串转换为浮点或十进制有时会导致长精度_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

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)