2009-07-04 35 views
17

Vì vậy, tôi đang lập kế hoạch để tạo ra một ứng dụng (PHP/MySQL) có rất nhiều tiền, và tôi đang nghĩ về cách lưu trữ và vận hành bằng tiền, đề cập đến kiểu dữ liệu float PHP và số thập phân MySQL.PHP/MySQL: Hoạt động lưu trữ/lưu trữ tiền tốt nhất?

Tôi đã nghĩ đến hai tùy chọn. Một trong số đó là vận hành và lưu trữ tiền theo định dạng số nguyên cent ($ đô la * 100) để không xử lý các lệnh in float và lưu trữ nó trong DB dưới dạng số nguyên. Một cách khác là lưu trữ trong DB dưới dạng thập phân và sử dụng BC Math trong PHP để tính toán.

Vì vậy, tôi googled tất cả các đêm để tìm ra đó là lựa chọn tốt nhất để sử dụng và không tìm thấy một câu trả lời rõ ràng. Lựa chọn hợp lý duy nhất mà tôi thấy là số nguyên một (mà tôi không thực sự thích vì nó có nghĩa là rất nhiều chuyển đổi từ đô la sang xu và ngược lại trước mỗi màn hình trong trình duyệt và trước khi lưu trữ trong DB) .

Ngoài ra, mọi người đã phàn nàn về số thập phân MySQL (MySQL lưu trữ số thập phân dưới dạng chuỗi, vận hành chúng dưới dạng phao vv), nhưng đó là các bài đăng cũ. Theo tài liệu MySQL, phiên bản hiện tại xử lý số thập phân chính xác, đơn khiếu nại duy nhất là nó cắt bớt phần giá trị vượt quá độ dài phần khai báo (ví dụ: nếu bạn lưu trữ giá trị 12.326 trong cột thập phân được khai báo (9,2)) , nhưng từ các cuộc điều tra của tôi nó làm tròn nó thay vì chỉ cắt ngắn (12.326 trở thành 12.33), đó là chính xác theo ý kiến ​​của tôi. Và, tôi không tìm thấy bất kỳ đề xuất nào về việc lưu trữ tiền dưới dạng số thập phân và thực hiện các phép tính bằng cách sử dụng PHP BCMath, và theo tôi, điều này là do ít người biết về các hàm toán học của BC và GMP.

Vì vậy, lựa chọn nào tốt nhất để sử dụng, xem xét độ chính xác, tốc độ (tốc độ tính toán BCMath, tốc độ thập phân MySQL so với số nguyên) và sự thoải mái lập trình?

+0

Mặc dù hơi muộn cho OP, cho bất cứ ai quan tâm, tôi mở có nguồn gốc a [PHP Thư viện tiền] (https://github.com/brick/money) thực hiện các phép tính an toàn trên các khoản tiền có kích thước bất kỳ, sử dụng PHP thuần túy, GMP hoặc BCMath dựa trên những gì có sẵn. Oh, và tôi cất giữ số tiền của mình làm số nguyên trong DB. – Benjamin

Trả lời

4

Tôi chắc chắn sẽ sử dụng int và định tuyến mọi thứ thông qua kiểu đối tượng dữ liệu (ORM) để xử lý tất cả chuyển đổi cho bạn. Mã máy khách sử dụng đối tượng dữ liệu sẽ không bao giờ cần phải chuyển đổi và sẽ không quan tâm, trong khi bạn sẽ không gặp vấn đề với lưu trữ vì int được xử lý dễ dàng bởi DB. Hơn nữa, bạn có thể thêm bất kỳ phương thức nào khác cần thiết cho đối tượng tiền (như chuyển đổi giữa các loại tiền, v.v.) khá dễ dàng.

+0

+1 để lưu trữ tiền dưới dạng số nguyên. Điều này hoạt động tốt với nhiều loại tiền tệ: lưu trữ tiền cùng với mã tiền tệ và bạn đột nhiên không quan tâm liệu bạn nên sử dụng 2 chữ số thập phân (đối với USD) hay 0 chữ số thập phân (cho JPY) cho 'DECIMAL' của bạn. 123,00 USD sẽ được lưu trữ là [12300, 'USD'] trong khi JPY 123 sẽ được lưu trữ là [123, 'JPY']. Và tất nhiên, ** không bao giờ sử dụng nổi trong bất kỳ phần nào của các tính toán hoặc lưu trữ liên quan đến tiền của bạn **. – Benjamin

1

Tôi cũng gặp khó khăn trong việc tìm kiếm thông tin về BCMath, vì vậy tôi đã nghiên cứu và viết bài viết của riêng tôi về nó: http://www.exploringbinary.com/base-conversion-in-php-using-bcmath/.

(Tôi không lấy lập trường rằng bạn nên sử dụng BCMath -. Tôi chỉ đem lại cho bạn thông tin)

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