2013-04-19 12 views
24

Po prostu bawię się ucząc się funkcji klas itd. Tak więc postanowiłem stworzyć prostą funkcję, która powinna dać mi kwotę podatku.nieobsługiwany typ (y) argumentu dla *: 'float' i 'Dziesiętny'

to jest mój kod do tej pory ...

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) 

Mój problem jest Dostaję następujący błąd:

nieobsługiwany typ argumentu (ów) dla *: 'pływaka' i " Dziesiętny "

Nie rozumiem, dlaczego to nie powinno działać!

Odpowiedz

30

Wygląda na to, że self.VAT jest typu decimal.Decimal, a self.amount to float, którego nie można wykonać.

Zamiast tego wypróbuj .

+0

pływak, dziesiętnie, to samo? Czego powinienem używać w przypadku waluty? – Prometheus

+1

Jest odwrotnie; 'self.VAT = decimal.Decimal ('0.095')'. –

+2

@ Spike: Nie, 'decimal.Decimal()' to nie to samo, co 'float'. Jest to inne podejście do obsługi liczb rzeczywistych przez komputery. –

5

Twój problem jest, jak mówi o błędzie, że starasz się pomnożyć Decimal przez float

Najprostszym rozwiązaniem jest przepisać wszelkie odniesienia do amount deklarując je jako ułamek dziesiętny obiektu:

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

aw initialize:

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

Innym rozwiązaniem byłoby zadeklarować dziesiętnych w ostatnim wierszu:

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

... ale wydaje Messier.

Powiązane problemy