如何在 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')
我知道(大部分)不同舍入规则的背景和计算机中浮点数的二进制表示。所以我的问题不是为什么会这样,而是我如何才能实现 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')