在合約管理系統開發時,遇到經典的浮點數比較問題:
明明數值相同,== 卻回傳 false。這是因為二進位浮點數無法精確表示十進位小數,運算過程產生微小誤差(如 12299.999999...)。
round() 四捨五入再比較」—— 仍可能因精度邊界失效== 或 === —— 絕對不可靠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
DECIMAL(19,4) 或 BIGINT 儲存「分」為單位的整數float 型別/^\d+(\.\d{1,2})?$/ 限制小數位數浮點數比較是經典坑,永遠不要用 == 直接比較。採用 bccomp() 搭配適當 scale,或改用整數(分為單位)運算,才是專業且穩健的做法。