【问题标题】:unsupported operand type(s) for *: 'float' and 'Decimal'* 不支持的操作数类型:'float' 和 'Decimal'
【发布时间】:2013-04-12 21:33:01
【问题描述】:

我只是在学习类函数等,所以我决定创建一个简单的函数来计算税额。

这是我目前的代码。

class VAT_calculator:
    """
     A set of methods for VAT calculations.
    """

    def __init__(self, amount=None):
        self.amount = amount
        self.VAT = decimal.Decimal('0.095')

    def initialize(self):
        self.amount = 0

    def total_with_VAT(self):
        """
        Returns amount with VAT added.
        """
        if not self.amount:
            msg = u"Cannot add VAT if no amount is passed!'"
            raise ValidationError(msg)

        return (self.amount * self.VAT).quantize(self.amount, rounding=decimal.ROUND_UP)

我的问题是我收到以下错误:

* 不支持的操作数类型:'float' 和 'Decimal'**

我不明白为什么这不起作用!

【问题讨论】:

  • 也许设计师试图让你思考你真正想要的东西:浮点数或小数(更精确的精度定义),decimal.Decimal(0.77)*2 Decimal('1.540000000000000035527136788') 很好,整数自动提升为十进制;但是 >>> decimal.Decimal(0.77)*0.78 Traceback(最近一次调用最后):文件“”,第 1 行,在 类型错误:不支持的操作数类型 *:'decimal.Decimal'和“浮动”会导致崩溃。如果你想要十进制结果,我想这会迫使你将浮点数转换为十进制,如果你不关心精度,则将小数转换为浮点数。

标签: python django


【解决方案1】:

似乎self.VATdecimal.Decimal 类型,而self.amountfloat,你不能这样做。

改用decimal.Decimal(self.amount) * self.VAT

【讨论】:

  • 浮点数、十进制数,还是一样的吗?我应该使用什么货币?
  • 反之亦然; self.VAT = decimal.Decimal('0.095').
  • @Spike:不,decimal.Decimal()float 不同。这是一种通过计算机处理实数的不同方法。
  • 无法用 decimal.Decimal(self.amount) 将 4.9 转换为 Decimal,并且增值税已经是 decimal.Decimal('0.095')
  • @Spike:您是否也将 (decimal.Decimal(self.amount)) 加入了 quantize 电话?
【解决方案2】:

正如错误所说,您的问题是您试图将 Decimal 乘以 float

最简单的解决方案是重写对 amount 的任何引用,将其声明为 Decimal 对象:

self.amount = decimal.Decimal(float(amount))

initialize:

self.amount = decimal.Decimal('0.0')

另一种选择是在最后一行声明小数:

return (decimal.Decimal(float(self.amount)) * self.VAT).quantize(decimal.Decimal(float(self.amount)), rounding=decimal.ROUND_UP)

...但这似乎更混乱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-24
    相关资源
    最近更新 更多