在decimal模块文档中,我读到了:
class decimal.Inexact
表示发生了舍入,结果不准确。 [...]圆润 返回结果。 [...]
如何获得圆润的结果?这是一个例子:
>>> from decimal import Decimal, Context, Inexact
>>> (Decimal("1.23")/2).quantize(Decimal("0.1"), context=Context(traps=[Inexact]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.4/decimal.py", line 2590, in quantize
context._raise_error(Inexact)
File "/usr/lib/python3.4/decimal.py", line 4043, in _raise_error
raise error(explanation)
decimal.Inexact: None
答案 0 :(得分:1)
你误解了文档;只有当你没有陷阱时,操作才会返回舍入结果,而是在上下文中设置Inexact
标志。
但是当您捕获异常时,它会被引发并且不返回舍入结果。
来自tutorial portion of the documentation:
上下文还具有用于监视计算期间遇到的异常情况的信号标志。标志保持设置直到明确清除,因此最好使用
clear_flags()
方法清除每组受监控计算之前的标志。
>>> from decimal import localcontext
>>> with localcontext() as ctx:
... (Decimal("1.23")/2).quantize(Decimal("0.1"))
... print(ctx.flags)
...
Decimal('0.6')
{<class 'decimal.Subnormal'>: 0, <class 'decimal.Underflow'>: 0, <class 'decimal.DivisionByZero'>: 0, <class 'decimal.Inexact'>: 1, <class 'decimal.Rounded'>: 1, <class 'decimal.InvalidOperation'>: 0, <class 'decimal.Overflow'>: 0, <class 'decimal.Clamped'>: 0}
此处设置了decimal.Inexact
和decimal.Rounded
标记,告诉您Decimal('0.6')
返回值不准确。
仅在特定信号出错时才使用陷印;例如四舍五入会对你的申请造成问题。