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

PHP float 型別使用說明:科學記號表示、精度陷阱、高精度計算替代方案 (BCMath/GMP)

     編輯:PHP 綜合知識

字面值表示

<?php
$a = 1.234;    // 標準浮點
$b = 1.2e3;    // 科學記號 = 1200
$c = 7E-10;    // 科學記號 = 0.0000000007
?>

精度陷阱經典案例

<?php
echo 0.1 + 0.2; // 0.30000000000000004
echo (0.1 + 0.2) === 0.3; // false

// 跨平台不一致
var_dump(1.234567890123456789); // 可能輸出 1.2345678901235
?>

原因:IEEE 754 雙精度浮點數無法精確表示十進位小數 (如 0.1)。

比較浮點數正確姿勢

<?php
// 1. 設定容差 (epsilon)
function floatEquals($a, $b, $epsilon = 1e-10) {
    return abs($a - $b) < $epsilon;
}

// 2. BCMath 字串比較 (任意精度)
function floatEqualsBC($a, $b, $scale = 10) {
    return bccomp($a, $b, $scale) === 0;
}

// 3. sprintf 格式化後比較字串 (不推薦)
?>

高精度計算替代方案

擴充特點適用場景
BCMath字串運算、任意精度、函數式 API (bcadd, bcmul, bcdiv, bccomp...)金融、貨幣、精確小數
GMP整數運算、任意大小、支援位運算、物件導向 (PHP 8.1+)大整數、密碼學、組合數學
Decimal (PHP 8.3+ 提案)原生十進位浮點、IEEE 754-2008 decimal128未來標準

BCMath 實戰範例

<?php
// 價格計算:單價 * 數量 + 稅
$price = '19.99';
$qty   = '3';
$tax   = '0.05';

$subtotal = bcmul($price, $qty, 2);        // 59.97
$taxAmt   = bcmul($subtotal, $tax, 2);     // 3.00
$total    = bcadd($subtotal, $taxAmt, 2);  // 62.97

echo "總計: $total"; // 62.97 (精確)
?>

型別轉換規則

  • 字串 → float:前導數字部分解析,"123.45abc" → 123.45
  • 整數 → float:精確轉換 (64位整數可能超過 float 53位尾數精度)
  • 布林/Null/陣列/物件 → 先轉整數再轉浮點

結語

**金融/計費/庫存等精確度敏感業務,嚴禁直接使用 float 運算**。請統一採用 BCMath (小數) 或 GMP (大整數),資料庫欄位用 DECIMAL(precision, scale) 儲存。

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