Python 十进制 ROUND_UP InvalidOperation

Python decimal ROUND_UP InvalidOperation

为什么要转换为带 2 位小数的数字?

x = 369.69

y=decimal.Decimal(x)
Decimal('369.68999999999999772626324556767940521240234375')

即使我已经声明

getcontext().prec = 2       

?

那为什么如果我尝试获取综述以获得 370.00:

y.quantize(decimal.Decimal('0.01'),rounding=decimal.ROUND_UP)

最终出现此错误:

InvalidOperation: quantize result has too many digits for current context quantize result has too many digits for current context

问题是 x 是一个浮点数,因此您一分配给 x 就失去了精度。如果您想解决这个问题,可以将 x 设为字符串 "369.69"。从字符串构建的 Decimal 将具有精确的精度。

创建 Decimal 对象时,prec 将被忽略。来自 the documentation:

The significance of a new Decimal is determined solely by the number of digits input. Context precision and rounding only come into play during arithmetic operations.

您在 quantize 中遇到的错误是因为结果中的位数大于设置的精度。 prec 设置 位数,而不是小数点后的位数。

>>> y = decimal.Decimal(69.69)
>>> y
Decimal('69.68999999999999772626324556767940521240234375')
>>> y.quantize(decimal.Decimal('1'), rounding=decimal.ROUND_UP)
Decimal('70')