2013-04-19 8 views
24

Sto solo giocando intorno alle funzioni di classi di apprendimento, ecc. Quindi ho deciso di creare una funzione semplice che dovrebbe darmi l'importo delle tasse.tipo/i di operando non supportato per *: 'float' e 'Decimal'

questo è il mio codice finora ...

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) 

Il mio problema è che io sto ottenendo il seguente errore:

tipo di operando non supportato (s) per *: 'float' e ' Decimale '

Non vedo perché questo non dovrebbe funzionare!

risposta

30

Sembra self.VAT è di decimal.Decimal tipo e self.amount è una float, cosa che non si può fare.

Prova decimal.Decimal(self.amount) * self.VAT invece.

+0

galleggiante, decimale, stessa cosa? Cosa dovrei usare per la valuta? – Prometheus

+1

È il contrario; 'self.VAT = decimal.Decimal ('0.095')'. –

+2

@Spike: No, 'decimal.Decimal()' non è la stessa cosa di 'float'. È un approccio diverso alla gestione dei numeri reali da parte dei computer. –

5

Il tuo problema è, come dice l'errore, che si sta cercando di moltiplicare un Decimal da un float

La soluzione più semplice è quella di riscrivere ogni riferimento alla amount dichiarandolo come oggetto decimale:

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

e in initialize:

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

Un'altra opzione sarebbe quella di dichiarare decimali nella vostra linea finale:

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

... ma che sembra Messier.

Problemi correlati