为什么Pandas中的round方法不会将0.5四舍五入为1?

4

我发表这篇文章是因为我认为这是答案,因为我在这里找不到类似的问题和答案。

我期望pandas的round方法将0.5四舍五入为1。

>>> import pandas as pd
>>> pd.Series([0.5, 1.5, 2.5, 3.5, 4.5]).round()
0    0.0
1    2.0
2    2.0
3    4.0
4    4.0
dtype: float64

更加奇怪的是:Python的round方法在Python 2.7和3.6中有不同的行为:
Python 2.7:
>>> [round(x) for x in [0.5, 1.5, 2.5, 3.5, 4.5]]
[1.0, 2.0, 3.0, 4.0, 5.0]

Python 3.6:

>>> [round(x) for x in [0.5, 1.5, 2.5, 3.5, 4.5]]
[0, 2, 2, 4, 4]

这是否与浮点数表示或我的平台(Mac OS X)有关?

感谢@root。不知何故,当我搜索这个问题时,现有的那个问题没有出现 - 即使在我写问题时的相似帖子列表中也没有。 - Bill
2个回答

4
我相信这在Python中实际上是预期的行为,而不是浮点问题。查看文档

如果两个倍数距离相等,则四舍五入向偶数选择(因此,例如,round(0.5)和round(-0.5)都是0,round(1.5)是2)。


哦,我明白了。所以它不是浮点表示法。它被四舍五入到最接近的偶数有什么原因吗?而不是朝零方向或“向上”远离零(我一直认为应该是这样)? - Bill
1
@Bill 为了原因,请阅读该副本。 - wim
1
什么是dupe?我再次阅读了Python文档,但找不到原因。但我在这里找到了一个解释:“我认为原因是为了防止将数字平均向上或向下偏置。” - Bill
@Bill,作为以后的参考,“dupe”是“duplicate”的缩写。 - sacuL

0

这确实是由于浮点算术所致,正如Python 3 round()文档中所述:

对于浮点数,round()的行为可能会令人惊讶:例如,round(2.675, 2)返回的结果是2.67而不是预期的2.68。这不是一个错误:这是因为大多数十进制小数不能精确地表示为浮点数。


2
这个问题没有解释为什么0.5向下舍入为0,而1.5向上舍入为2。这两个小数都具有足够小的数量级,并且分母是2的幂,在浮点表示中具有精确的表示。 - chepner
@chepner Python文档自相矛盾。它们说四舍五入将会朝最接近的偶数方向进行...但是然后他们又说,有时候不会这样--但这不是一个错误。 - Carl Parker
问题在于2.675不是2675/1000;它更接近于267/100和268/100。只有当要舍入的值恰好处于两个选项之间时,才会向最接近的偶数舍入。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接