Ruby中不一致的舍入?

Ruby中不一致的舍入?,ruby,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中的行为相同。您使用的是浮点数。浮点数不精

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中的行为相同。

您使用的是浮点数。浮点数不精确。有关标准中的介绍,请参见


简短的版本是:永远不要在任何需要精度的地方使用浮动

看看我对这个问题的回答


这可能是同一件事

回想起来很有用,思考起来也很讽刺,但浮点数只准确地表示:(a)几个分数或(b)所有整数

所以,要得到一个精确的表示,分数必须由二的(负)幂组成。因此,以下分数是唯一精确表示的介于.01和.99之间的分数:

0.25
0.50
0.75

换句话说,FP在处理整数时非常精确。想想看。

嘿嘿,我甚至没想到这一点。回想起来很有道理。听起来不太对。你应该得到尾数中可以表示的所有负指数的确切答案(维基百科告诉我,尾数现在被称为“有效位”——一定是在我上学后发生的)。因此,
2**1/n
应该适用于任何可以放入尾数的
n
。不?差不多,但只有当n是2的幂时。由1/2,1/4,1/8,1/16,1/32。。。可以精确地表示,“当n是2的幂时”--嗯,对,这就是我的意思:)的可能重复