如何在Python(版本3)中使用传统的十进制数舍入?

时间:2014-05-21 00:44:14

标签: python python-3.x decimal

我正试图弄清楚如何使用Python版本3(特别是版本3.4.0)在小学和中学教授的传统方法来舍入十进制数字。

例如,使用十进制数 0.745 ,我试图将其舍入到最接近的百分位数。 传统上,舍入值为0.75,但下面的代码给出了0.74:

>>> import decimal
>>> a = decimal.Decimal("0.745")
>>> round(a, 2)
Decimal('0.74')

但是,将原始值更改为 0.746 似乎返回0.75:

>>> import decimal
>>> b = decimal.Decimal("0.746")
>>> round(b, 2)
Decimal('0.75')

这似乎与传统的舍入相矛盾(如果我没记错的话)。 有人能引导我在Python中使用正确的舍入方法吗?

更新 使用所选答案的指导,这是我的问题的完整代码解决方案:

>>> import decimal
>>> decimal.getcontext().rounding = decimal.ROUND_HALF_UP
>>> a = decimal.Decimal("0.745")
>>> round(a, 2)
Decimal('0.75')

2 个答案:

答案 0 :(得分:5)

这是预期的(也是最好的)行为:所谓的"银行家的四舍五入"这是无偏见的,并且将一半舍入到最接近的整数。

你可以随时:

import decimal
decimal.getcontext().rounding = decimal.ROUND_HALF_UP

请注意,ROUND_HALF_UP有偏见,这就是为什么它不是默认值。

答案 1 :(得分:1)

如果您知道要舍入到哪个精度,您可以随时添加一些额外的数据来围绕它想要的方式(而不一定是其他人期望的那样):

def round_my_way(dec, precision):
    dec += decimal.Decimal(1.0/10**(precision+1) / 2)
    return round(dec, precision)

print round_my_way(decimal.Decimal("0.746"), 2) # Prints 0.75
print round_my_way(decimal.Decimal("0.745"), 2) # Prints 0.75
print round_my_way(decimal.Decimal("0.744"), 2) # Prints 0.74