【问题标题】:Why does Pandas round method not round 0.5 up to 1? [duplicate]为什么 Pandas 舍入方法不将 0.5 舍入到 1? [复制]
【发布时间】:2018-10-08 19:11:13
【问题描述】:

我发布这个我认为是答案,因为我在这里找不到类似的问题答案。

我预计 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。无论出于何种原因,当我搜索这个问题时,现有的问题都没有出现 - 甚至在我写这个问题时也没有出现在类似帖子的列表中。

标签: python pandas rounding


【解决方案1】:

我相信在这种情况下,它实际上是 python 中的预期行为,而不是浮点问题。看着documentation

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

【讨论】:

  • 哦,我明白了。所以它不是浮点表示。是否有理由将其四舍五入到最接近的偶数?而不是说朝向零或“向上”远离零(我一直认为它应该是)?
  • @Bill 原因,请阅读骗局。
  • 什么是欺骗?我再次阅读了 Python 文档,但找不到原因。但我找到了here 的解释:“我认为原因是为了防止将数字平均向上或向下倾斜。”
  • @Bill,为了将来参考,“dupe”是“duplicate”的缩写。
【解决方案2】:

这确实是由于floating point arithmetic,如 Python 3 documentation for round() 中所述:

round() 用于浮点数的行为可能令人惊讶:例如,round(2.675, 2) 给出了2.67,而不是预期的2.68。这不是错误:这是因为大多数小数不能完全表示为浮点数。

【讨论】:

  • 这忽略了为什么 0.5 向下舍入为 0,但 1.5 向上舍入为 2。两个小数,具有足够小的量级并且以 2 的幂作为分母,在浮点中具有精确的表示。
  • @chepner Python docs 自相矛盾。他们说四舍五入将朝着最接近的偶数...但是他们说,嗯,有时它不会 - 但它不是一个错误。
  • 问题是2.675不是2675/1000;这是一个更接近 267/100 和 268/100 的数字。向最接近的偶数舍入适用于要四舍五入的值恰好在两个选项之间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 2022-07-27
  • 1970-01-01
相关资源
最近更新 更多