如何在 Python 中舍入科学(对称/数学)?

How to round scientific (symetric / mathematic) in Python?

我知道(大部分)不同舍入规则的背景和计算机中浮点数的二进制表示。所以我的问题不是为什么会这样,而是我如何才能实现 round scientific 的目标。 如果我错了,请纠正我,但可能的同义词是 对称舍入 数学舍入 、四舍五入 银行家四舍五入 。正确吗?

在下面的示例中,值 2.5(来自 mean([2, 3]))应四舍五入为 2,而 3.5(来自 mean([4, 3]))应四舍五入至 3。但事实并非如此。

使用 Python 内置例程

Python 3.9.2 (default, Feb 28 2021, 17:03:44) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> round((3+4)/2)
4
>>> round((3+2)/2)
2

我试过 numpy 假设这是用于科学用途。

>>> import numpy as np
>>> np.round(np.mean([3, 4]))
4.0
>>> np.round(np.mean([3, 2]))
2.0

我发现了 Python 自己的 decimal 模块,其中 ROUND_HALF_EVEN 在我看来是正确的循环模式。但也许我在这里错了?

>>> import decimal
>>> decimal.getcontext().rounding
'ROUND_HALF_EVEN'
>>> (decimal.Decimal(3) + decimal.Decimal(4)) / 2
Decimal('3.5')
>>> (decimal.Decimal(3) + decimal.Decimal(2)) / 2
Decimal('2.5')
>>> decimal.getcontext().prec = 1
>>> (decimal.Decimal(3) + decimal.Decimal(4)) / 2
Decimal('4')
>>> (decimal.Decimal(3) + decimal.Decimal(2)) / 2
Decimal('2')

估计是我理解有误

由于@MisterMiyagi 的评论,我要求的舍入规则是 Python 中的 decimal.ROUND_HALF_DOWN

>>> import decimal
>>> decimal.getcontext().rounding
'ROUND_HALF_EVEN'
>>> decimal.getcontext().rounding = decimal.ROUND_HALF_DOWN
>>> (decimal.Decimal(3) + decimal.Decimal(4)) / 2
Decimal('3')
>>> (decimal.Decimal(3) + decimal.Decimal(2)) / 2
Decimal('2')