10

我是 Python 的初学者,我有一个问题。
为什么像 5.5, 7.5, (anything).5 这样的数字使用奇数部分round(num)正确地工作(规则 5/4),但是像 (anything).5 这样的数字通过相同的函数使用非奇数部分只返回整数部分?(但如果我们在该十进制数上添加一个像 0.000000001 这样的小数,它就可以正常工作)

我的意思是下一个:

round(9.5)

返回 10,它是正确的。但

round(8.5)

返回 8,这是不正确的。和

round(8.5 + 0.0000000000001)

返回 9。

为什么它工作不正确?
我在 Windows 上使用 Python 3.2.2。

4

1 回答 1

24

与 Python 2.x 相比,Python 3.x对函数使用Banker 的舍入。round()

这是记录在案的行为:

[I]如果两个倍数相等,则向偶数选择进行舍入(例如,round(0.5) 和 round(-0.5) 均为 0,round(1.5) 为 2)。

由于浮点数本质上只是近似值,因此如何处理“精确”半整数并不重要——无论如何,前面的计算中总是存在舍入误差。

编辑:要获得旧的舍入行为,您可以使用

def my_round(x):
    return int(x + math.copysign(0.5, x))
于 2012-04-10T17:50:04.927 回答