PHP 支援多種浮點數寫法:
<?php
$a = 1.234; // 一般十進位
$b = 1.2e3; // 科學標記法(1.2 × 10³ = 1200)
$c = 7E-10; // 科學標記法(7 × 10⁻¹⁰)
?>
[0-9]+([0-9][.]{LNUM}) | ({LNUM}[.][0-9]*)[+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})透過遞迴逼近可求得系統支援的最大浮點數(約 1.79769313486E+308):
<?php
function float_max($mul = 2, $affine = 1) {
$max = 1; $omax = 0;
while ((string)$max !== 'INF') {
$omax = $max;
$max *= $mul;
}
for ($i = 0; $i < $affine; $i++) {
$pmax = 1; $max = $omax;
while ((string)$max !== 'INF') {
$omax = $max;
$max += $pmax;
$pmax *= $mul;
}
}
return $omax;
}
echo "最大浮點數: "; var_dump(float_max());
// 輸出:float(1.79769313486E+308)
?>
十進位小數(如 0.1、0.7)無法精確以二進位浮點數表示,導致計算誤差:
<?php
echo floor((0.1 + 0.7) * 10); // 輸出 7,非預期的 8
// 內部實際值約為 7.999999999999999
?>
$a == $b)<?php
// 使用 epsilon 比較
function floatEquals($a, $b, $epsilon = 0.00001) {
return abs($a - $b) < $epsilon;
}
// 或使用 BCMath 高精度比較
echo bccomp('0.1', '0.7', 10); // 回傳 -1、0、1
?>
PHP 5 起,嘗試將物件轉為浮點數會觸發 E_NOTICE 錯誤。
浮點數精度問題源於 IEEE 754 標準的二進位表示限制。處理金融、科學計算時,務必採用任意精度數學函數庫,避免直接使用原生浮點數運算與比較。