浮點數精度問題是所有基於 IEEE 754 標準的語言通病,PHP 也不例外。本文剖析兩大典型場景並給出最佳實踐。
<?php
$a = 0.2 + 0.7; // 0.8999999999999999
$b = 0.9; // 0.9000000000000000
var_dump($a == $b); // bool(false)
?>
直接比較不可靠。解決方案:
var_dump(bcadd(0.2, 0.7, 1) == '0.9'); // true。指定小數位數,返回字符串比較。abs($a - $b) < 0.00001。適用於科學計算場景。<?php
echo ceil(2.1 / 0.7); // 輸出 4,預期 3
printf("%.20f", 2.1 / 0.7); // 3.00000000000000044409
?>
因除法結果略大於 3,ceil 進位成 4。修正方法:
<?php
// 先四捨五入到足夠精度,再取整
echo ceil(round(2.1 / 0.7, 1)); // 3
?>
round($val, 1) 將誤差截斷,保證後續 ceil/floor/intval 正確。
round() 控制精度後再比較或取整。== **比較浮點數**,改用 bccomp() 或容差判斷。number_format() 或 printf() 格式化,避免科學記數法。PHP 官方文檔 浮點數 章節詳細說明了二進制表示限制。理解底層原理有助於在架構層面規避風險。