Tôi đã thừa hưởng một đống mã kế thừa khổng lồ được viết bằng PHP trên cơ sở dữ liệu MySQL. Điều tôi nhận thấy là ứng dụng sử dụng doubles
để lưu trữ và thao tác dữ liệu.
Bây giờ tôi đã xem qua rất nhiều bài viết đề cập đến việc double
không phù hợp với hoạt động tiền tệ vì các lỗi làm tròn số. Tuy nhiên, tôi vẫn chưa bắt gặp một giải pháp hoàn chỉnh về cách xử lý các giá trị tiền tệ trong mã PHP và được lưu trữ trong cơ sở dữ liệu MySQL.
Có cách thực hành tốt nhất khi xử lý tiền cụ thể trong PHP không?
Những điều tôi đang tìm kiếm là:
- Dữ liệu nên được lưu trữ trong cơ sở dữ liệu như thế nào? loại cột? kích thước?
- Làm thế nào các dữ liệu nên được xử lý trong cộng, trừ bình thường. Nhân hay chia?
- Khi nào tôi nên làm tròn các giá trị? Bao nhiêu làm tròn là chấp nhận được nếu có?
- Có sự khác biệt giữa xử lý các giá trị tiền tệ lớn và giá trị thấp?
Lưu ý: Một RẤT đơn giản hóa mẫu mã như thế nào tôi có thể gặp các giá trị tiền trong cuộc sống hàng ngày (vấn đề an ninh khác nhau đã bị lờ đi cho đơn giản hóa Tất nhiên trong cuộc sống thực tôi sẽ không bao giờ sử dụng mã của tôi như thế này.):
$a= $_POST['price_in_dollars']; //-->(ex: 25.06) will be read as a string should it be cast to double?
$b= $_POST['discount_rate'];//-->(ex: 0.35) value will always be less than 1
$valueToBeStored= $a * $b; //--> any hint here is welcomed
$valueFromDatabase= $row['price']; //--> price column in database could be double, decimal,...etc.
$priceToPrint=$valueFromDatabase * 0.25; //again cast needed or not?
Tôi hy vọng bạn sử dụng mã mẫu này như một phương tiện để đưa ra nhiều trường hợp sử dụng hơn và không lấy nó theo nghĩa đen tất nhiên.
Câu hỏi thưởng Nếu tôi sử dụng ORM như Học thuyết hoặc PROPEL, thì việc sử dụng tiền trong mã của tôi sẽ khác nhau như thế nào.
decimal
loại trong C # có độ chính xác hạn chế nhưng hoàn toàn phù hợp với các giá trị tiền tệ.