【问题标题】:Python decimal ROUND_UP InvalidOperationPython 十进制 ROUND_UP 无效操作
【发布时间】:2015-03-16 16:15:42
【问题描述】:

为什么会发生这种转换为 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

【问题讨论】:

  • y=y.quantize(decimal.Decimal(),rounding=decimal.ROUND_UP) 适合我

标签: python decimal rounding


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    当您创建 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')
    

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 2014-03-14
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      相关资源
      最近更新 更多