使用.quantize()进行十进制舍入不使用原始上下文

时间:2015-11-12 18:31:32

标签: python python-2.7 decimal rounding

如果我执行以下操作,我希望0.005向上舍入为0.01而不是向下0.00,因为舍入设置为 ROUND_HALF_UP

>>> import decimal
>>> currency = decimal.Context(rounding=decimal.ROUND_HALF_UP)
>>> cents = decimal.Decimal('0.00')
>>> amount = currency.create_decimal('0.005')
>>> amount
Decimal('0.005')
>>> amount.quantize(cents)
Decimal('0.00')

但是,如果我将货币传递给quantize(),它就会正确地完成:

>>> amount.quantize(cents, context=currency)
Decimal('0.01')

为什么金额(由货币上下文创建)不使用货币上下文进行回合?

注意:这个问题不是要求如何舍入到2位小数。我只是以此为例。我想知道为什么Decimal创建的Context在量化/舍入时不会使用相同的Context

2 个答案:

答案 0 :(得分:6)

十进制对象不保留它们的创建上下文。使用特定上下文的十进制操作(例如Context.create_decimalDecimal.quantize与上下文参数)仅覆盖该一个操作的全局上下文;对结果Decimal的进一步操作是通过全局上下文完成的。

如果您希望所有操作都使用ROUND_HALF_UP,则可以设置全局上下文:

decimal.setcontext(currency)

但是如果你想混合上下文,你必须为每个需要除全局上下文之外的上下文的操作显式提供一个上下文。

答案 1 :(得分:0)

您需要使用decimal.setcontext()设置上下文,或将其作为关键字参数传递给quantize()函数才能正常工作。

>>> import decimal
>>> currency = decimal.Context(rounding=decimal.ROUND_HALF_UP)
>>> decimal.setcontext(currency) # setting the context
>>> cents = decimal.Decimal('0.00')
>>> amount = currency.create_decimal('0.005')
>>> amount.quantize(cents)
Decimal('0.01')

使用decimal.getcontext().rounding = decimal.ROUND_HALF_UP全局设置上下文也可以正常工作,但随后它将用于所有Decimal的所有操作。

>>> import decimal
>>> decimal.getcontext().rounding = decimal.ROUND_HALF_UP
>>> cents = decimal.Decimal('0.00')
>>> amount = decimal.Decimal('0.005')
>>> amount.quantize(cents)
Decimal('0.01')