PHP 精度計算引發的災難性Bug

2021-07-26 14:01:09 字數 591 閱讀 2834

在維護乙個比較老的金融專案時,發現精度的計算簡單粗暴,先來看一下**片段:

if($accountinfo['account_money'] < $repaymoney )
如上**片段變數所示,上面的**主要是比較帳戶餘額及還款數,兩者均為雙精度浮點數,稍作修改**,讓我們能看到一些輸出才更直觀

if($accountinfo['account_money'] < $repaymoney )\n\r";

echo "\n\r";

rollback();

return false;

}

執行如上**得到如下圖結果

兩個數均為1333.35,如果按上面的邏輯來說,不應該進入到 if 體內,但結果卻恰恰相反,進行 if 體內並echo 出了兩值,通過查閱相關api 發現,php 的精度運算,會在直接+,-,*,/,等運算時丟失精度,因此結果並非如你所願,在這裡提現大家,在php中對精度運算,應呼叫相關api,如bc math.

php精度計算

預設保留兩位小數 bcadd 引數1,引數2,引數3 引數1 和2 是要相加的引數 3是保留幾位小數。bcadd任意精度數的相加 bcsub任意精度數的減法 bcmul乘法,bcdiv除法 bcmod取餘數。比 功能更強大 bcpow冪函式運算 bcsqrt平方根 sqrt平方根運算 pow求冪 a...

PHP算術及精度計算

一 高精度算術運算子 bcadd 將兩個高精度數字相加 bccomp 比較兩個高精度數字,返回 1,0,1 bcdiv 將兩個高精度數字相除 bcmod 求高精度數字餘數 bcmul 將兩個高精度數字相乘 bcpow 求高精度數字乘方 bcpowmod 求高精度數字乘方求模,數論裡非常常用 bcsc...

php高精度數計算

一 前方有坑 php在使用加減乘除等運算子計算浮點數的時候,經常會出現意想不到的結果,特別是關於財務資料方面的計算,給不少工程師惹了很多的麻煩。比如今天工作終於到的乙個案例 a 2586 b 2585.98 var dump a a a b 期望的結果是 float 0.02 實際結果 float ...