国产又猛又爽又黄视频|在线观看人成视频免费|少妇高潮太爽了在线视频|911国产免费无码专区|特黄做受又大又粗又长大片|欧美一级二级免费在线观看|日日夜人人澡人人澡人人看免|欧洲午夜精品一级毛片在线播放

利用PHP高精確度運算BC函數(shù)庫解決小數(shù)計算異常問題

2017-11-05 12:40 欄目:技術(shù)開發(fā) 查看(12006)

現(xiàn)在開發(fā)項目,很多時候都與支付相關(guān),而在支付流程中就必然牽扯到金額的計算,在現(xiàn)實生活中商品的價格不一定都是整數(shù),標(biāo)準(zhǔn)的價格是兩位小數(shù)精確到分。比如11.20、32.30、9.80等等?,F(xiàn)在對于中小型項目,主流都是使用支付寶支付和微信支付這兩種第三方方式。

不管哪種第三方方式都有可能出現(xiàn)掉單的情況,出現(xiàn)掉單的原因可能有很多種。但有一種非常常見,就是在異步通知的時候訂單校驗失?。ú还苣姆N支付方式訂單校驗是必須要做的一種安全校驗,當(dāng)然實際還需校驗其他的東西,比如說appid);而之所以出現(xiàn),金額校驗不通過情況就是因為某些金額數(shù)字包含某些小數(shù);如果是直接比較,那么顯然會出問題。

現(xiàn)在舉一個例子,假設(shè)使用的微信支付,支付金額為32.30;那么訂單的實際支付金額是32.30,微信異步通知的金額是3230(以分為單位),如果直接比較,那么就返回false,那自然接下來更新訂單狀態(tài)等等一系列操作都不能執(zhí)行下去了,因為校驗都沒通過。

var_dump(32.30*100==3230);——-顯示bool(false)

按理說,我們?nèi)说臄?shù)學(xué)計算,這個結(jié)果應(yīng)該是true,然而機器和人還是不一樣的,要知道現(xiàn)在的機器是基于二進(jìn)制的,因此才會造成誤差,具體大家可以在網(wǎng)上閱讀相關(guān)資料。

然而如果這么來比較,又會顯示不一樣的結(jié)果:

var_dump(bcmul(32.30,100)==3230);—-顯示bool(true)

而其中的bcmul就屬于PHP數(shù)學(xué)擴展中的BC函數(shù)庫,是其中用于對2個任意精度數(shù)字乘法計算的函數(shù)。

BC函數(shù)庫包含了加減乘除、乘方、二次根等多種高精度計算函數(shù),具體如下:

  1. bcadd?— 2個任意精度數(shù)字的加法計算
  2. bccomp?— 比較兩個任意精度的數(shù)字
  3. bcdiv?— 2個任意精度的數(shù)字除法計算
  4. bcmod?— 對一個任意精度數(shù)字取模
  5. bcmul?— 2個任意精度數(shù)字乘法計算
  6. bcpow?— 任意精度數(shù)字的乘方
  7. bcpowmod?—?求高精度數(shù)字乘方求模,數(shù)論里非常常用
  8. bcscale?— 設(shè)置所有bc數(shù)學(xué)函數(shù)的默認(rèn)小數(shù)點保留位數(shù)
  9. bcsqrt?— 任意精度數(shù)字的二次方根
  10. bcsub?— 2個任意精度數(shù)字的減法

以上函數(shù)具體內(nèi)容可以參考PHP官方文檔關(guān)于BC函數(shù)庫的介紹:

http://php.net/manual/zh/ref.bc.php

 

與我們的項目經(jīng)理聯(lián)系
掃二維碼與項目經(jīng)理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流

轉(zhuǎn)載請注明出處:利用PHP高精確度運算BC函數(shù)庫解決小數(shù)計算異常問題 - 微構(gòu)網(wǎng)絡(luò)
分享: