由Ruby float truncate混淆

时间:2011-02-07 17:30:56

标签: ruby floating-point

Float上的truncate方法显然会将float截断为整数。那么这里发生了什么:

>> 14820.truncate
=> 14820
>> (148.2 * 100)
=> 14820.0
>> 14820.0.truncate
=> 14820
>> (148.2 * 100).truncate
=> 14819

为什么最后的计算输出也不是14820?

4 个答案:

答案 0 :(得分:5)

浮点舍入错误,与truncate无关。例如。试试这个

 (148.2 * 100) < 14820

返回true。形象地说,您得到号码148.199999999而不是148.2,因为148.2无法在浮点数中完全表示

答案 1 :(得分:3)

148.2 * 100的结果可能不完全是14820,但由于浮点错误而略微低于该值。因此,它将截断为14819。

你可以看到这个值:

>sprintf("%.19f", 148.2*100)
=> "14819.9999999999981810106"

答案 2 :(得分:0)

如上所述,这是浮点舍入误差。我将补充说Ruby有一个buit-in类Rational,它可以代表没有这种缺点的有理分数,所以你可能想要使用它。

答案 3 :(得分:0)

您是否考虑过舍入而不是截断?