Ruby 为什么在浮点上调用_i会从值中减去1?
我有一个例子,我正在对一个浮点对象做一些数学运算,当我对它调用_I时,它被减少了一个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 并非所有的浮点数
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
。