2013-04-19 31 views
24

Tôi chỉ chơi quanh các lớp học chức năng v.v. Vì vậy, tôi quyết định tạo một hàm đơn giản, cái gì sẽ cho tôi số tiền thuế.loại toán hạng không được hỗ trợ cho *: 'float' và 'Decimal'

đây là mã của tôi cho đến nay ...

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) 

Vấn đề của tôi là tôi nhận được lỗi sau:

không được hỗ trợ loại toán hạng (s) cho *: 'phao' và ' Thập phân '

Tôi không hiểu tại sao điều này không hoạt động!

Trả lời

30

Có vẻ như self.VAT là loại decimal.Decimalself.amountfloat, điều mà bạn không thể làm.

Thay vào đó hãy thử decimal.Decimal(self.amount) * self.VAT.

+0

float, decimal, cùng điều tho? Tôi nên sử dụng loại tiền nào? – Prometheus

+1

Đó là cách khác xung quanh; 'self.VAT = decimal.Decimal ('0.095')'. –

+2

@Spike: Không, 'decimal.Decimal()' không giống với 'float'. Đó là một cách tiếp cận khác để xử lý số thực bằng máy tính. –

5

vấn đề của bạn là, như các lỗi nói rằng bạn đang cố gắng để nhân một Decimal bởi một float

Giải pháp đơn giản nhất là viết lại bất kỳ tài liệu tham khảo để amount tuyên bố nó như là một đối tượng Decimal:

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

và trong initialize:

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

Một lựa chọn khác sẽ được tuyên bố thập phân trong dòng cuối cùng của bạn:

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

... nhưng điều đó dường Messier.

Các vấn đề liên quan