考虑以下十进制舍入方法:
使用量化:
>>> (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
语句?
答案 0 :(得分: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