Ruby中的舍入不一致?

时间:2009-12-22 23:22:23

标签: ruby

Ruby在舍入中有错误吗?为什么它的行为如下:

>> [1.14, 1.15, 1.16].map{|x| "%.1f" % x}
=> ["1.1", "1.1", "1.2"]
>> [1.4, 1.5, 1.6].map{|x| "%.0f" % x}
=> ["1", "2", "2"]

如同,为什么1.15四舍五入到1.1,但1.5舍入为2?至少,这不一致吗? ruby 1.9.1和ruby 1.8.7中的行为相同。

3 个答案:

答案 0 :(得分:5)

看看我对这个问题的回答

Why does Perl's sprintf not round floating point numbers correctly?

这可能是同一件事

答案 1 :(得分:2)

您正在使用浮点数。浮点数不精确。有关标准的介绍,请参阅http://en.wikipedia.org/wiki/IEEE_754-2008

简短版本是:永远不要使用浮动任何需要精确度的任何东西!

答案 2 :(得分:1)

回想起来也很有用,而且考虑起来也很讽刺,但浮点数只能代表:( a)几个分数或(b)所有整数。

因此,为了得到精确的表示,分数必须由2的(负)幂组成。因此,以下分数是.01和.99之间唯一完全代表的分数:

0.25
0.50
0.75

换句话说,FP在处理整数时非常准确。去图。