Python的十进制模块不支持从1开始的数字。

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'

有人能解释一下吗?

1个回答

11

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

1.00000
^ ^^^^^

这个数字是1加上5个小数位,这就是为什么会报错,提示“结果超出了当前上下文的位数限制”。注意:看,错误信息其实已经解释了! =D

对于小于1的数字,精确度恰好为5个数字,因为小数点前面的部分不重要。

0.90000
  ^^^^^

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

max_digits设置为6对我来说可行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接