ใน PHP การเทียบค่า floating point ด้วย == มักให้ผลผิด เพราะการเก็บค่าภายใน (internal representation) ไม่แม่นยำ ต้องใช้วิธีอื่น
ตัวอย่างปัญหา
<?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'; ?>
ผลลัพธ์
a and b are not same.
วิธีแก้: ใช้ Epsilon (ค่าความคลาดเคลื่อนยอมรับได้)
<?php $val1 = 2.183459; $val2 = 2.183450; $epsilon = 0.00001; if(abs($val1 - $val2) < $epsilon) echo "True"; else echo "False"; ?>
ผลลัพธ์
True
ใช้ abs() หาความต่างสัมบูรณ์ เปรียบเทียบกับ epsilon
วิธีแก้: ใช้ round()
<?php $val1 = 9 - 6.2; $val2 = 1.8; var_dump(round($val1, 2) == round($val2, 2)); ?>
ผลลัพธ์
bool(true)
ปัดเศษทศนิยมก่อนเปรียบเทียบ