任何想法为什么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'
有人在乎解释吗?
答案 0 :(得分:11)
这是因为您将最大精度context.prec
设置为5位,而您还将decimal_places
设置为小数点后的5位。将值1和以上放置将给出6位精度(有效数字):
1.00000
^ ^^^^^
这是1
加上5位小数。这就是为什么它抱怨说“结果对于当前上下文有太多数字”。 注意:看,错误信息实际上解释了它! = d
对于低于1的数字,精确到5位数,因为小数点前的部分不重要。
0.90000
^^^^^
您无需设置context.prec
,或将其设置为更大的数字。你为什么要首先设置上下文?
将max_digits
设置为6对我有效。