首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 浮點數精度值控制完整解析:ini_set precision 影響範圍與實際運算

     編輯:PHP 相關知識

precision 設定只影響「顯示」,不影響「儲存/運算」

<?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 定義:總有效數字位數 (整數部 + 小數部)

precision數值輸出說明
12 (預設)0.1234567890.123456789整數 0 不計位,小數 9 位
50.1234567890.12346四捨五入至 5 位
1212.12345678912.123456789整數 2 位 + 小數 10 位 = 12
512.12345678912.123整數 2 位 → 小數剩 3 位
312345678.1231.23E+7整數 8 位 > precision → 科學記號
512345678.12312346000整數 8 位 > precision+4 → 科學記號門檻

科學記號切換規則:整數部位數 - precision > 4 時改用科學記號,否則以 0 補齊。


浮點數運算不受 precision 影響

<?php
ini_set('precision', 8);
$a = 1331625729.687;
$b = 1331625730.934;
echo $a;     // 1331625700 (顯示截斷)
echo $b;     // 1331625700 (顯示截斷)
$diff = $a - $b;
echo $diff;  // -1.247 (實際運算用完整精度)
?>

echo/var_dump/json_encode 都會丟失精度

<?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
?>

最佳實踐:永遠用字串或 BCMath 傳遞/儲存精確數值

<?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
?>

除錯建議

  1. 開發環境設定 ini_set('precision', 20) 觀察完整數值
  2. 單元測試用 bccomp($expected, $actual, 10) === 0 比對
  3. 日誌記錄原始字串,不記錄 echo 後的輸出

結語

precision 只是「顯示用的眼鏡」,戴上或摘下都不改變浮點數的真實面目。金融/科學計算請拋棄原生 float,全程採用 字串 + BCMath 或 整數分單位,唯有輸出報表時才用 printf('%.2f') 格式化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved