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

Iva*_*lov 9 python rounding python-3.x

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

我的意思是下一个:

round(9.5)
Run Code Online (Sandbox Code Playgroud)

返回10,这是正确的.但

round(8.5)
Run Code Online (Sandbox Code Playgroud)

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

round(8.5 + 0.0000000000001)
Run Code Online (Sandbox Code Playgroud)

返回9.

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

Sve*_*ach 19

Python 3.x都有,相比之下到Python 2.x中,使用银行家舍入round()功能.

这是记录在案的行为:

[I] f两个倍数同样接近,向均匀选择进行舍入(因此,例如,圆形(0.5)和圆形(-0.5)都是0,圆形(1.5)是2).

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

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

def my_round(x):
    return int(x + math.copysign(0.5, x))
Run Code Online (Sandbox Code Playgroud)

  • 总结这样四舍五入的原因:如果`x.5`数字是某些数据的重要部分,那么将它们全部向上舍入也会使平均值向上移动.但是,如果你将其中的一半向上和向下一半,平均值应保持不变. (4认同)
  • @gxoptg:尝试`def roundHalfUp(f):return round(f + 0.00000000000001)`或`def roundHalfUp(f):return math.floor(f + 0.5)` (2认同)