2013-03-13 36 views
5

Tôi đang viết một kịch bản nhỏ để tính giá trị thuế sau khi khấu trừ. Ứng dụng của tôi có một số tập lệnh PHP cung cấp chức năng CRUD. Tôi có thể thêm chi phí hàng tháng, tổng thu nhập được lập hóa đơn và sau đó tính toán số tiền thuế doanh nghiệp còn nợ.Tính toán PHP là thiếu sót

Tất cả các dữ liệu được lưu trữ trong cơ sở dữ liệu, tuy nhiên tôi đã xem qua một vấn đề thú vị khi thực hiện các tính toán, tôi sẽ đơn giản hóa mã dưới đây, để nó có thể được sao chép:

$total = 1.0; 
$tax = 0.2; 
$expenses = 0.05; 

echo (($total-$tax) + $expenses); // this echo's 0.85 
// (1.0 - 0.2) + 0.05 

if((($total-$tax) + $expenses) == 0.85) { 
    echo "totals add up"; 
} 
else { 
    echo "accounting error"; 
} 

Ý tưởng là tất cả các tổng số được tính là phần trăm. 1,0 là 100% thu nhập và chi phí cho tháng được đề cập là 5% (không thực sự, nhưng vì lý do, vì tính toán thực sự của tôi hơi phức tạp hơn một chút), dù cách này có vẻ đơn giản nhất Tôi có thể tính toán được.

Vì vậy, 100% (thu nhập) - 20% (thuế doanh nghiệp) + 5% (chi phí yêu cầu) nên để lại cho tôi 85% tổng số. Như thể hiện bởi các echo đầu tiên statment.

Tuyên bố if tuy nhiên sẽ đi lên và nói "lỗi kế toán". Chuyện gì đang xảy ra ở đây?

+1

Đây là vấn đề thường gặp với các số dấu phẩy động IEEE754. Về cơ bản bạn sẽ _never_ có một bình đẳng ở đó ... Để xem những gì tôi có nghĩa là, thêm một 'echo (($ total- $ thuế) + $ chi phí);' dòng để xem những gì được ở đó ... – ppeterka

+0

@ peterka tôi đã có tiếng vang, nó in 0,85 – Husman

+2

[Điều mà mọi lập trình viên nên biết về điểm nổi] (http://floating-point-gui.de/) – Barmar

Trả lời

4

Đây là vấn đề phổ biến với tính toán dấu chấm động. Để đặt nó ngắn, một số số thập phân không thể được mô tả chính xác trong nhị phân.

Giải pháp phổ biến là gắn bó với số nguyên và tính toán tất cả mọi thứ trong xu và chỉ khi xuất ra chia cho 100.

1

Bạn có thể muốn điều tra tiện ích mở rộng BCMath của PHP. Tôi đã tìm thấy tham chiếu bằng cách tìm kiếm trang web này và tìm câu hỏi here.

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