15

Tôi nên sử dụng lớp nào để biểu diễn tiền để tránh hầu hết các lỗi làm tròn?Lớp nào dùng để đại diện tiền?

Tôi có nên sử dụng Decimal hoặc tích hợp đơn giản number không?

Hiện có bất kỳ lớp học hiện tại Money nào có hỗ trợ quy đổi tiền tệ mà tôi có thể sử dụng không?

Bất kỳ cạm bẫy nào mà tôi nên tránh?

+0

Tôi luôn nghĩ rằng chuyển đổi tiền tệ chỉ là phép nhân. – SilentGhost

+2

@SilentGhost: Có và không. Bạn phải ghi nhớ * cách * bạn sẽ sử dụng các giá trị mà bạn có. Làm thế nào để bạn làm khi bạn trả U $ S2000 + AR $ 6300 + € 1500 năm ngoái và năm nay bạn đã trả U $ S4000 + AR $ 1200 + € 500?Có nhiều thứ bạn phải tính đến, vì vậy đối tượng 'Money' sẽ cần lưu giá trị hiện tại * và * giá trị hiện tại. – voyager

+3

Hư hỏng cần tránh: sử dụng số dấu phẩy động. Xem không gian văn phòng. –

Trả lời

6

Tôi giả sử bạn nói về Python. http://code.google.com/p/python-money/ "Nguyên thủy để làm việc với tiền và tiền tệ bằng Python" - tiêu đề tự giải thích :)

+1

Đó là những thẻ dành cho :) – voyager

+0

Nhìn vào http://code.google.com/p/python-money/source/browse/trunk/money/Money.py Tôi có thể thấy rằng chúng sử dụng 'Thập phân' cho đại diện nội bộ :) – voyager

4

Bạn có thể quan tâm đến QuantLib để làm việc với tài chính.

Nó đã được xây dựng trong các lớp học để xử lý các loại tiền tệ và tuyên bố 4 năm phát triển tích cực.

+0

Dự án này có vẻ thú vị, nhưng có thể hơi quá nhiều, tôi rất có thể sẽ sử dụng một dự án python thuần khiết để đơn giản. – voyager

3

Bạn có thể xem thư viện này: python-money. Vì tôi không có kinh nghiệm với nó nên tôi không thể bình luận về tính hữu ích của nó.

A 'lừa' bạn có thể sử dụng để xử lý tiền tệ như số nguyên:

  • Multiply 100/Divide bởi 100 (ví dụ $ 100,25 -> 10025) để có một đại diện trong 'cent'
+5

Nhiều hệ thống kế toán theo dõi mọi thứ chính xác hơn so với xu. –

+0

Đúng, nhưng tất cả phụ thuộc vào nhu cầu tôi đoán ... Thư viện quantlib được tham chiếu trong chủ đề này có vẻ là một ứng cử viên tốt cho công việc tài chính 'nghiêm túc'. – ChristopheD

8

Chỉ cần sử dụng decimal.

+1

số thập phân không phù hợp vì cách xử lý chính xác. Giả sử bạn đang xử lý số tiền ít hơn 10 tỷ đô la với độ chính xác là 0,01 đô la, vì vậy bạn cho thư viện thập phân số của bạn sẽ không dài quá 12 chữ số. Bây giờ bạn có hai vấn đề: mã của bạn không thể xử lý siêu lạm phát; và $ 0,01 sẽ được hiển thị là '0.010000000000'. – Pitarou

9

Không bao giờ sử dụng số dấu phẩy động để đại diện cho tiền. Các số động không đại diện cho các số theo ký hiệu thập phân một cách chính xác. Bạn sẽ kết thúc với một cơn ác mộng của các lỗi làm tròn hợp chất, và không thể chuyển đổi một cách đáng tin cậy giữa các loại tiền tệ. Xem Martin Fowler's short essay on the subject.

Nếu bạn quyết định viết lớp của riêng mình, tôi khuyên bạn nên dựa trên loại dữ liệu decimal.

Tôi không nghĩ rằng python-tiền là một lựa chọn tốt, bởi vì nó không được duy trì trong một thời gian và mã nguồn của nó có một số mã lạ và vô dụng, và trao đổi tiền tệ chỉ đơn giản là bị hỏng.

Hãy thử py-moneyed. Đó là một sự cải tiến so với tiền trăn.

0

đơn giản, trọng lượng nhẹ, tuy nhiên ý tưởng mở rộng:

class Money(): 

    def __init__(self, value): 
     # internally use Decimal or cents as long 
     self._cents = long(0) 
     # Now parse 'value' as needed e.g. locale-specific user-entered string, cents, Money, etc. 
     # Decimal helps in conversion 

    def as_my_app_specific_protocol(self): 
     # some application-specific representation 

    def __str__(self): 
     # user-friendly form, locale specific if needed 

    # rich comparison and basic arithmetics 
    def __lt__(self, other): 
     return self._cents < Money(other)._cents 
    def __add__(self, other): 
     return Money(self._cents + Money(other)._cents) 

Bạn có thể:

  • Thực hiện những gì bạn cần trong ứng dụng của bạn.
  • Kéo dài khi bạn phát triển.
  • Thay đổi cách trình bày và triển khai nội bộ nếu cần.