Trong PHP, việc kiểm tra các giá trị dấu phẩy động cho bằng nhau là một vấn đề, vì PHP không thành công khi kiểm tra xem một số dấu phẩy động có bằng một số khác hay không. Mặc dù thực tế, các số dấu phẩy động dường như có cùng giá trị không cần thực sự giống hệt nhau. Vì vậy, trong bài viết này sẽ giải thích vấn đề chúng ta đang gặp phải so với Số dấu phẩy động và các quy trình khác nhau để tránh vấn đề này.
Ví dụ
Hãy kiểm tra điều này bằng một ví dụ đơn giản:
<?php $a = 0.14; $b = 1 - 0.86; //0.14 if($a == $b ){ echo 'a and b are same'; } else { echo 'a and b are not same'; } ?>
đầu ra:
a and b are not same.
Giải thích:
Trong đoạn mã này, điều kiện else được thực thi thay vì điều kiện if, mặc dù $ a và $ b giống nhau. Đó là do đặc điểm của các giá trị dấu phẩy động mà cách chúng được biểu diễn bên trong. Hãy thảo luận về các trường hợp khác nhau trong PHP để tránh vấn đề này trong thời gian thực.
Trường hợp 1:
Thể hiện sự so sánh các giá trị dấu phẩy động bằng cách sử dụng sự khác biệt nhỏ nhất trong phép tính trong hệ thống máy tính.
Ví dụ:
<?php $val1 = 2.183459; $val2 = 2.183450; $epsilon = 0.00001; if(abs($val1 - $val2) < $epsilon) { echo "True"; } else { echo "False"; } ?>
Đầu ra:
True
Giải thích:
Ở đây chúng tôi đang sử dụng hai biến dấu phẩy động val1 và val2 cùng với epsilon. Sau đó, chúng tôi lấy sự khác biệt tuyệt đối của các biến (val1 và val2) bằng cách sử dụng hàm gốc có tên là abs (). Đoạn mã này sẽ cung cấp cho chúng ta giá trị tuyệt đối nhưng câu hỏi đặt ra là tại sao chúng ta lại lấy các giá trị tuyệt đối? Câu trả lời là chúng ta có thể thấy rằng cả hai giá trị có cùng chữ số sau phần thập phân cho đến giá trị chính xác 5, điều này rất khó để PHP phân tích so sánh.
Trường hợp 2:
Sử dụng hàm round ().
<?php $val1 = 9 - 6.2; $val2 = 1.8; var_dump(round($val1, 2) == round($val2, 2)); ?>
Đầu ra:
bool(true)
Giải thích:
Ở đây chúng tôi đang sử dụng hai biến dấu phẩy động val1 và val2. Sau đó, chúng tôi đang sử dụng hàm được xác định trước có tên là round () làm tròn các giá trị động lên đến hai chữ số thập phân và sau đó so sánh nó. Ở đây Chúng tôi đang sử dụng hàm round () được xác định trước để có được kết quả mong đợi của chúng tôi theo cách chính xác.