十进制.quantize舍入误差

4
我遇到了一个问题,使用Decimal数据类型时,quantize方法似乎会产生舍入误差:
Decimal('1.0055').quantize(Decimal('0.000')) # Should output 1.006
>> Decimal('1.006') # CORRECT output
Decimal('1.0045').quantize(Decimal('0.000')) # Should output 1.005
>> Decimal('1.004') # INCORRECT output

为什么有时候会四舍五入,有时候则是四舍五入后取整?

在第一个情况下,.0055 大于 .0050,因此它将被四舍五入到最接近的 .006。在第二个情况下,.0045 小于 .0050,因此它将被四舍五入到 .004 - user5777975
嗨,这并没有真正回答为什么会发生这种情况,测试1.0065和1.0075时可以看到相同的问题。 - Zak Stucke
1个回答

3

简而言之,这被称为银行家舍入法

默认的舍入模式是

ROUND_HALF_EVEN (to nearest with ties going to nearest even integer)

这正是您看到的:代码 45 之间,以及代码 56 之间的联系会指向偶数(分别是 46)。
如果您想要不同的舍入模式,您需要明确指定。
选择包括:
ROUND_CEILING (towards Infinity),
ROUND_DOWN (towards zero),
ROUND_FLOOR (towards -Infinity),
ROUND_HALF_DOWN (to nearest with ties going towards zero),
ROUND_HALF_EVEN (to nearest with ties going to nearest even integer),
ROUND_HALF_UP (to nearest with ties going away from zero), or
ROUND_UP (away from zero).
ROUND_05UP (away from zero if last digit after rounding towards zero would have been 0 or 5; otherwise towards zero)

文档:https://docs.python.org/2/library/decimal.html#decimal.Context

请查看quantize()中的rounding参数:https://docs.python.org/2/library/decimal.html#decimal.Decimal.quantize


太好了!这解释了正在发生的事情。在参数中添加其中一个会给出我上面期望的输出吗?谢谢。 - Zak Stucke
实际上,有几个需要考虑的因素。您需要考虑到精确的一半和负数应该发生什么,并且选择将变得清晰明了。 - NPE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接