Python中的舍入错误与非奇数?

时间:2012-04-10 17:46:51

标签: python python-3.x rounding

我是Python的初学者,我有一个问题 为什么舍入一个数字,如5.5,7.5,(任何).5与奇数整数部分应用round(num)正常工作(规则5/4),但舍入数字像(任何).5与非奇整数部分由相同的函数只返回一个整数部分? (但是如果我们在这个十进制数字中添加一个像0.000000001这样的小数字就可以正常工作了)

我的意思是下一个:

round(9.5)

返回10,这是正确的。但

round(8.5)

返回8,但不正确。和

round(8.5 + 0.0000000000001)

返回9。

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

1 个答案:

答案 0 :(得分:19)

与Python 2.x相比,Python 3.x对round()函数使用Banker's rounding

这是documented行为:

  

[I] f两个倍数相等,向均匀选择进行舍入(例如,圆形(0.5)和圆形(-0.5)均为0,圆形(1.5)为2)。 / p>

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

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

def my_round(x):
    return int(x + math.copysign(0.5, x))