2013-04-19 10 views
24

私はちょうどクラスの機能の学習などをやっているので、税金を払うべきものを簡単な関数にすることにしました。これは、これまでの私のコードです*: 'float'と 'Decimal'のサポートされていないオペランドタイプ

...

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) 

私の問題私は、次のエラー取得しています:「フロート」と「:*のため

サポートされていないオペランドのタイプ(複数可)小数点 '

これが機能しない理由はわかりません!

答えて

30

self.VATdecimal.Decimalタイプで、self.amountfloatであると思われます。

代わりにdecimal.Decimal(self.amount) * self.VATを試してください。

+0

浮動小数点、同じものtho?私は通貨のために何を使用すべきですか? – Prometheus

+1

それは逆です。 'self.VAT = decimal.Decimal( '0.095')'。 –

+2

@ Spike:いいえ、 'decimal.Decimal()'は 'float'と同じではありません。これは、コンピュータによって実数を扱う別のアプローチです。 –

5

エラーが最も簡単な解決策は、Decimalオブジェクトとして宣言amountへの参照を書き換えることであるあなたがfloat

Decimalを乗算しようとしていることを、言うようにあなたの問題は、次のとおりです。

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

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

別のオプションは、あなたの最後の行に小数を宣言するために、次のようになります。

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

...しかし、それはメシエようです。

関連する問題