Python decimal ROUND_UP InvalidOperation

时间:2015-03-16 16:15:43

标签: python decimal rounding

为什么会将此转换为包含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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:-1)

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

  

新十进制的重要性仅由输入的位数决定。上下文精度和舍入仅在算术运算期间发挥作用。

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

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