<?php
ini_set('precision', 8);
$num = 12.123456789;
echo $num; // 12.123457 (8 位有效數字:整數 2 位 + 小數 6 位)
// 但實際運算仍用完整精度
$sum = $num + 0.000000001;
echo $sum; // 12.123458 (仍受 precision 限制顯示)
var_dump($num); // float(12.123456789) 內部完整保留
?>
| precision | 數值 | 輸出 | 說明 |
|---|---|---|---|
| 12 (預設) | 0.123456789 | 0.123456789 | 整數 0 不計位,小數 9 位 |
| 5 | 0.123456789 | 0.12346 | 四捨五入至 5 位 |
| 12 | 12.123456789 | 12.123456789 | 整數 2 位 + 小數 10 位 = 12 |
| 5 | 12.123456789 | 12.123 | 整數 2 位 → 小數剩 3 位 |
| 3 | 12345678.123 | 1.23E+7 | 整數 8 位 > precision → 科學記號 |
| 5 | 12345678.123 | 12346000 | 整數 8 位 > precision+4 → 科學記號門檻 |
科學記號切換規則:整數部位數 - precision > 4 時改用科學記號,否則以 0 補齊。
<?php
ini_set('precision', 8);
$a = 1331625729.687;
$b = 1331625730.934;
echo $a; // 1331625700 (顯示截斷)
echo $b; // 1331625700 (顯示截斷)
$diff = $a - $b;
echo $diff; // -1.247 (實際運算用完整精度)
?>
<?php
$val = 1315537636.338467;
echo $val; // 1315537636.3385
var_dump($val); // float(1315537636.3385)
json_encode($val); // 1315537636.3385
// 唯一正確:printf/sprintf 指定精度
printf('%.10f', $val); // 1315537636.3384670000
?>
<?php
// 資料庫存字串或 DECIMAL
$priceStr = '1315537636.338467';
// 運算用 BCMath
$total = bcadd($priceStr, '100.000001', 10); // '1315537736.338468'
// JSON 傳輸用字串
echo json_encode(['price' => $priceStr]); // {"price":"1315537636.338467"}
// 只有顯示給使用者看時才格式化
echo number_format($priceStr, 2, '.', ','); // 1,315,537,636.34
?>
ini_set('precision', 20) 觀察完整數值bccomp($expected, $actual, 10) === 0 比對echo 後的輸出precision 只是「顯示用的眼鏡」,戴上或摘下都不改變浮點數的真實面目。金融/科學計算請拋棄原生 float,全程採用 字串 + BCMath 或 整數分單位,唯有輸出報表時才用 printf('%.2f') 格式化。