如何正确舍入半浮点数?

新手上路,请多包涵

我正面临 round() 函数的奇怪行为:

 for i in range(1, 15, 2):
    n = i / 2
    print(n, "=>", round(n))

此代码打印:

 0.5 => 0
1.5 => 2
2.5 => 2
3.5 => 4
4.5 => 4
5.5 => 6
6.5 => 6

我希望浮动值始终四舍五入,但相反,它四舍五入到最接近的偶数。

为什么会有这样的行为,获得正确结果的最佳方法是什么?

我尝试使用 fractions 但结果是一样的。

原文由 Delgan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 893
2 个回答

数字类型 部分 明确记录了此行为:

round(x[, n])

x 四舍五入为 n 位,四舍五入为偶数。如果省略 n,则默认为 0。

注意 _四舍五入到偶数_。这也称为 bankers rounding ;不是总是向上或向下舍入(复合舍入误差),而是通过舍入到最接近的 偶数 来平均舍入误差。

如果您需要更多地控制舍入行为,请使用 decimal 模块,它可以让您准确指定 应该使用的舍入策略

例如,从一半向上舍入:

 >>> from decimal import localcontext, Decimal, ROUND_HALF_UP
>>> with localcontext() as ctx:
...     ctx.rounding = ROUND_HALF_UP
...     for i in range(1, 15, 2):
...         n = Decimal(i) / 2
...         print(n, '=>', n.to_integral_value())
...
0.5 => 1
1.5 => 2
2.5 => 3
3.5 => 4
4.5 => 5
5.5 => 6
6.5 => 7

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 4.0 许可协议

例如:

 from decimal import Decimal, ROUND_HALF_UP

Decimal(1.5).quantize(0, ROUND_HALF_UP)

# This also works for rounding to the integer part:
Decimal(1.5).to_integral_value(rounding=ROUND_HALF_UP)

原文由 dhobbs 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题