最近有客戶反應**訂單金額總是不準確,總是相隔一分錢。檢查相關**邏輯都是正確的,就是運用了四則運算。大概推測問題可能出在浮點計算丟失精度。在《php程式設計師雷雪松的部落格》中寫過一篇關於js精度不準確的文章-《js中浮點數運算不精準》。下面php程式設計師雷雪松詳細的介紹一下如何解決php浮點數運算精度問題。
php有乙個bc math高精確度的數學擴充套件,它可以為任意精度數學計算提供了二進位制計算器(binary calculator),它支援任意大小和精度的數字,以字串形式描述。在需要處理數字計算時,不要在簡單地使用四則運算,而要用bc math相關的函式來處理。
1、安裝bc math擴充套件
本類函式僅在 php 編譯時配置了 –enable-bcmath 時可用。php 的 windows 版本已內建對此擴充套件的支援,不需要載入額外的擴充套件來使用這些函式。如果需要編譯安裝,請參考php安裝編譯配置裡的擴充套件 。
2、bc math提供的函式
bcadd — 2個任意精度數字的加法計算
bccomp — 比較兩個任意精度的數字
bcdiv — 2個任意精度的數字除法計算
bcmod — 對乙個任意精度數字取模
bcmul — 2個任意精度數字乘法計算
bcpow — 任意精度數字的乘方
bcpowmod — raise an arbitrary precision number to another, reduced by a specified modulus
bcscale — 設定所有bc數學函式的預設小數點保留位數
bcsqrt — 任意精度數字的二次方根
bcsub — 2個任意精度數字的減法
3、bc math函式用法1
2345
6bcscale(3); /設定小數點之後的位數,不設定,預設正整數
echo bcadd('1.234', '5'); // 6.234
echo bcsub('1.234', '5'); // -3.766
echo bcmul('2', '4'); // 8
echo bcdiv('105', '6.55957', 3); // 16.007,設定3位小數點
echo bcmod('4', '2'); // 0
PHP 浮點數高精度運算
記錄下,工作中遇到的坑 關於 php 浮點數運算,特別是金融行業 電子商務訂單管理 資料包表等相關業務,利用浮點數進行加減乘除時,稍不留神運算結果就會出現偏差,輕則損失幾十萬,重則會有信譽損失,甚至吃上官司,我們一定要引起高度重視!加 a 0.1 b 0.7 c intval a b 10 echo...
浮點數精度問題
一 例子 首先我們去編譯器試試 double a 1.9 通過新增監視檢視a的值 會發現a的值是1.8999999 二 開始今天的學習 在最開始學c 的時候並沒有對浮點數進行很深入的學習,認為浮點不就是小數嘛,首先在c 的巨集裡面有 flt max 和 flt min 的定義,float是四位元組的...
php 浮點數運算
php r echo 0.1 0.7 0.8 true false 了解浮點運算的都不難理解以上 執行時會得到false 這是因為很多的10進製數都不能精確的轉成2進製,或如果要精確轉換的話需要的二進位制數太長,會捨棄掉末尾部分,只儲存一定的精度。比如0.1 十進位制 0.0001100 1100 ...