Từ một bài báo tôi đã viết cho Authorize.Net :
Một cộng một bằng hai, phải không? Làm thế nào về .2 cộng với 1.4 nhân với 10? Điều đó bằng 16, phải không? Không nếu bạn đang làm toán với PHP (hoặc hầu hết các ngôn ngữ lập trình khác):
echo floor((0.2 + 1.4) * 10); // Should be 16. But it's 15!
Điều này là do cách số dấu phẩy động được xử lý nội bộ. Chúng được biểu diễn bằng một số vị trí thập phân cố định và có thể dẫn đến các số không cộng lại hoàn toàn như bạn mong đợi. Ví dụ nội bộ .2 cộng với 1.4 nhân 10 của chúng tôi tính toán khoảng 15,9999999998 hoặc lâu hơn. Loại toán này rất tốt khi làm việc với những con số không cần phải chính xác như tỷ lệ phần trăm. Nhưng khi làm việc với độ chính xác của tiền, vấn đề quan trọng là một xu hoặc một đô la bị thiếu ở chỗ này hay chỗ khác sẽ tăng lên nhanh chóng và không ai thích bị thiếu bất kỳ khoản tiền nào.
Giải pháp Toán BC
May mắn thay, PHP cung cấp tiện ích mở rộng BC Math là "đối với toán học chính xác tùy ý, PHP cung cấp Máy tính nhị phân hỗ trợ các số có kích thước và độ chính xác bất kỳ, được biểu diễn dưới dạng chuỗi." Nói cách khác, bạn có thể tính toán chính xác với các giá trị tiền tệ bằng cách sử dụng tiện ích mở rộng này. tiện ích mở rộng BC Math chứa hàm s cho phép bạn thực hiện các thao tác phổ biến nhất với độ chính xác bao gồm bổ sung , phép trừ , phép nhân và phân chia .
Một ví dụ hay hơn
Đây là ví dụ tương tự như trên nhưng sử dụng hàm bcadd () để làm phép toán cho chúng ta. Nó có ba tham số. Hai giá trị đầu tiên là giá trị chúng ta muốn thêm và thứ ba là số chữ số thập phân mà chúng ta muốn chính xác. Vì chúng tôi đang làm việc với tiền, chúng tôi sẽ đặt độ chính xác là hai bảng thập phân.
echo floor(bcadd('0.2', '1.4', 2) * 10); // It's 16 like we would expect it to be.