Python十进制模块不喜欢1个以上的任何数字

时间:2013-10-17 10:06:50

标签: python math

任何想法为什么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'

有人在乎解释吗?

1 个答案:

答案 0 :(得分:11)

这是因为您将最大精度context.prec设置为5位,而您还将decimal_places设置为小数点后的5位。将值1和以上放置将给出6位精度(有效数字):

1.00000
^ ^^^^^

这是1加上5位小数。这就是为什么它抱怨说“结果对于当前上下文有太多数字”。 注意:看,错误信息实际上解释了它! = d

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

0.90000
  ^^^^^

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

max_digits设置为6对我有效。