Type(S) d'opérande non pris en charge pour*: 'float 'et'Decimal'

Je joue juste autour des fonctions d'apprentissage des classes, etc., alors j'ai décidé de créer une fonction simple qui devrait me donner le montant de l'impôt.

C'est mon code jusqu'à présent.

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)

Mon problème est que je reçois l'erreur suivante:

Type(S) d'opérande non pris en charge pour *: 'float' et 'Decimal' * *

Je ne vois pas pourquoi cela ne fonctionne pas!

29
demandé sur Ronak Shah 2013-04-19 17:13:25

2 réponses

Il semble que {[0] } soit de type decimal.Decimal et self.amount est une chose float que vous ne pouvez pas faire.

Essayez decimal.Decimal(self.amount) * self.VAT à la place.

41
répondu Sam Bruns 2016-08-22 23:16:18

Votre problème est, comme le dit l'erreur, que vous essayez de multiplier un Decimal par un float

La solution la plus simple consiste à réécrire toute référence à amount en la déclarant comme un objet décimal:

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

Et dans initialize:

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

Une autre option serait de déclarer des décimales dans votre dernière ligne:

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

...mais cela semble messier.

7
répondu jymbob 2014-01-28 22:55:20