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

PHP 浮點數比較陷阱與正確解法:bccomp 高精度比較

     編輯:PHP 綜合知識

經典陷阱:看似相等卻不相等

在合約管理系統開發時,遇到經典的浮點數比較問題:

明明數值相同,== 卻回傳 false。這是因為二進位浮點數無法精確表示十進位小數,運算過程產生微小誤差(如 12299.999999...)。

錯誤迷思與風險

  • 「用 round() 四捨五入再比較」—— 仍可能因精度邊界失效
  • 「轉整數比較(乘 100)」—— 易溢位、不支援任意小數位
  • 直接使用 == 或 === —— 絕對不可靠

正確解法:BCMath 高精度比較 bccomp()

PHP 內建 BCMath 擴展 提供任意精度數學運算,bccomp() 專為比較設計:

bccomp 參數說明

bccomp(string $num1, string $num2, int $scale = 0): int
// 回傳值: 1 (num1 > num2) | 0 (相等) | -1 (num1 < num2)
// $scale:比較的小數位數(建議依業務需求設定,如金額用 2)

完整比較工具函數範例

b, 0: 相等, -1: a

金融/會計系統的額外建議

  1. 資料庫層面:使用 DECIMAL(19,4) 或 BIGINT 儲存「分」為單位的整數
  2. PHP 層面:全程以字串或 BCMath 物件運算,避免 float 型別
  3. 輸入驗證:使用正則 /^\d+(\.\d{1,2})?$/ 限制小數位數

結語

浮點數比較是經典坑,永遠不要用 == 直接比較。採用 bccomp() 搭配適當 scale,或改用整數(分為單位)運算,才是專業且穩健的做法。

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