Python中的十进制量化与精度在上下文中的区别

7
考虑以下十进制舍入方法:
使用量化:
>>> (Decimal('1')/Decimal('3')).quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)
Decimal('0.33')

使用上下文:
>>> ctx = Context(prec=2, rounding=ROUND_HALF_UP)
>>> setcontext(ctx)
>>> Decimal('1')/Decimal('3')
Decimal('0.33')

这两种舍入方法有实际区别吗?有什么需要注意的地方吗?使用上下文是否更加优雅,以便我可以在整个计算块中使用 with 语句?

1个回答

0
>>> from decimal import Decimal, ROUND_HALF_UP, setcontext, Context
>>> ctx = Context(prec=2, rounding=ROUND_HALF_UP)
>>> setcontext(ctx)
>>> total = Decimal('0.002') + Decimal('0.002')
>>> total
Decimal('0.004')

实际上它并不会像我期望的那样自动四舍五入,所以我不能在整个计算块中使用它。

另一个问题是,临时值被四舍五入导致失去了精度。

from decimal import Decimal, ROUND_HALF_UP, getcontext, setcontext, Context

class FinanceContext:
    def __enter__(self):
        self.old_ctx = getcontext()
        ctx = Context(prec=2, rounding=ROUND_HALF_UP)
        setcontext(ctx)
        return ctx

    def __exit__(self, type, value, traceback):
        setcontext(self.old_ctx)


class Cart(object):
    @property
    def calculation(self):
        with FinanceContext():
            interim_value = Decimal('1') / Decimal('3')
            print interim_value, "prints 0.33, lost precision due to new context"

            # complex calculation using interim_value
            final_result = ...
            return final_result

你应该将这个作为你的问题的一部分添加进去,因为它并不是一个真正的答案。 - Burhan Khalid
我已修改了这个答案,它回答了我的一个问题。 - James Lin
嗨@JamesLin,你能解释一下ROUND_HALF_UP标志吗? - aldesabido
ROUND_HALF_UP(四舍五入,遇到0.5时向上取整) - James Lin

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