Float上的truncate方法显然会将float截断为整数。那么这里发生了什么:
>> 14820.truncate
=> 14820
>> (148.2 * 100)
=> 14820.0
>> 14820.0.truncate
=> 14820
>> (148.2 * 100).truncate
=> 14819
为什么最后的计算输出也不是14820?
答案 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)
您是否考虑过舍入而不是截断?