4

知道为什么 Python 的decimal模块不喜欢数字 1 或更多,而是 0.9 或更少吗?

>>> import decimal
>>> max_digits = 5
>>> decimal_places = 5
>>> context = decimal.getcontext().copy()
>>> context.prec = max_digits

1 本身的数字太多:

>>> value = decimal.Decimal('1')
>>> '%s' % str(value.quantize(decimal.Decimal(".1") ** decimal_places, context=context))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/decimal.py", line 2470, in quantize
    'quantize result has too many digits for current context')
  File "/usr/lib/python2.7/decimal.py", line 3872, in _raise_error
    raise error(explanation)
decimal.InvalidOperation: quantize result has too many digits for current context

但任何低于 1 的都可以:

>>> value = decimal.Decimal('0.9')
>>> '%s' % str(value.quantize(decimal.Decimal(".1") ** decimal_places, context=context))
'0.90000'

有人愿意解释吗?

4

1 回答 1

11

那是因为您将最大精度context.prec设置为 5 位,同时还设置decimal_places了小数点后 5 位。将值设置为 1 及以上将为您提供 6 位精度(重要数字):

1.00000
^ ^^^^^

也就是1小数点后 5 位。这就是它抱怨的原因,说“结果对于当前上下文有太多数字”。注意:看,错误信息实际上解释了它!=D

对于小于 1 的数字,精确到 5 位,因为小数点之前的部分不重要。

0.90000
  ^^^^^

您不需要设置context.prec, 或者,将其设置为更大的数字。为什么要首先设置上下文?

将 设置max_digits为 6 对我有用。

于 2013-10-17T10:17:49.753 回答