Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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 为什么在浮点上调用_i会从值中减去1?_Ruby_Floating Point Precision - Fatal编程技术网

Ruby 为什么在浮点上调用_i会从值中减去1?

Ruby 为什么在浮点上调用_i会从值中减去1?,ruby,floating-point-precision,Ruby,Floating Point Precision,我有一个例子,我正在对一个浮点对象做一些数学运算,当我对它调用_I时,它被减少了一个 value = 0.29 * 100 value.to_i => 28 我知道浮点数是不精确的表示,但这比我预期的要差得多。发生了什么事?我该如何预防 我使用的是ruby 1.8.7(它也发生在1.8.6中)。快速检查irb,发现0.29*100的计算结果为28.999…。调用Float#to_i完成其余部分,最终得到28个 (0.29 * 100).round => 29 并非所有的浮点数

我有一个例子,我正在对一个浮点对象做一些数学运算,当我对它调用_I时,它被减少了一个

value = 0.29 * 100
value.to_i
=> 28
我知道浮点数是不精确的表示,但这比我预期的要差得多。发生了什么事?我该如何预防


我使用的是ruby 1.8.7(它也发生在1.8.6中)。

快速检查irb,发现
0.29*100
的计算结果为
28.999…
。调用
Float#to_i
完成其余部分,最终得到28个

(0.29 * 100).round
 => 29 
并非所有的浮点数都是不精确的
29
是精确的,
0.25
是精确的,但是
0.29
不是。如果小数点右侧有一位丢失50位,则默认截断转换将返回下一个较低的整数


这就是为什么
#round
存在的原因。

人们什么时候才能理解浮点值在转换为整数时精度不高?在这种情况下,您可能需要使用
value。ceil
您预期会发生什么?我预期结果是29。您如何看到它的计算结果是
28.999…
?您启动irb,你输入
0.29*100
,点击回车键,它会告诉你表达式的值。我这样做,得到的
29.0
不是
28.999…
,因此我想返回29.Hm,试着用
“%.20f”%(0.29*100)
。在某些版本中,当使用普通
Float#inspect
Ahh时,它可能会舍入输出值。。。这产生了
28.9999999999644729