Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python(版本3)中使用十进制数字的传统舍入?_Python_Python 3.x_Decimal - Fatal编程技术网

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

如何在Python(版本3)中使用十进制数字的传统舍入?,python,python-3.x,decimal,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.

我试图找出如何使用传统方法对十进制数进行四舍五入,这种方法在小学和中学使用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')
这就是预期的(也是最好的)行为:所谓的“银行家四舍五入”,它是无偏的,将一半四舍五入到最接近的偶数整数

你可以随时:

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

请注意,
ROUND\u HALF\u UP
有偏差,这就是它不是默认值的原因。

如果您知道要舍入的精度,您可以随时添加一点额外的内容,以您想要的方式舍入它(不一定是其他人期望的):


你所观察到的没有什么出乎意料的。我相信作者指的是所描述的四舍五入启发式。Huu,谢谢,这个链接正好显示了我所指的内容。谢谢Dietrich!直到现在我才听说过“银行家取整”。在对它做了更多的研究之后,我同意它总的来说比我所学的传统舍入法要好。谢谢Huu!尽管另一个答案与这个问题更为相关,但知道这一点仍然很好。再次感谢!没问题!我把另一个答案投了赞成票,因为我不知道你可以这样改变舍入启发式。
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