如何获取decimal.Inexact异常的值?

时间:2014-04-27 11:06:35

标签: python exception decimal

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

1 个答案:

答案 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.Inexactdecimal.Rounded标记,告诉您Decimal('0.6')返回值不准确。

仅在特定信号出错时才使用陷印;例如四舍五入会对你的申请造成问题。