unsupported operand type(s) for *: 'float' and 'Decimal'

Question:

I’m just playing around learning classes functions etc, So I decided to create a simple function what should give me tax amount.

this is my code so far.

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)

My issue is I’m getting the following error:

unsupported operand type(s) for *: ‘float’ and ‘Decimal’**

I don’t see why this should not work!

Asked By: Prometheus

||

Answers:

It seems like self.VAT is of decimal.Decimal type and self.amount is a float, thing that you can’t do.

Try decimal.Decimal(self.amount) * self.VAT instead.

Answered By: aldeb

Your issue is, as the error says, that you’re trying to multiply a Decimal by a float

The simplest solution is to rewrite any reference to amount declaring it as a Decimal object:

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

and in initialize:

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

Another option would be to declare Decimals in your final line:

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

…but that seems messier.

Answered By: jymbob
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.