2024国产成人精品免费视频|日本免费一区二区三区毛片|久久97超碰色中文字幕|亚洲天堂a中文字幕

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

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

現(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)在的機器是基于二進制的,因此才會造成誤差,具體大家可以在網(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ù)的默認小數(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ò)
分享:
武邑县| 灵丘县| 曲麻莱县| 泊头市| 奉化市| 英超| 乡城县| 龙海市| 洮南市| 福鼎市| 清镇市| 化州市| 内丘县| 开原市| 澳门| 合水县| 宜春市| 西吉县| 杭锦旗| 文山县| 措勤县| 富平县| 昂仁县| 上思县| 油尖旺区| 高青县| 长海县| 陇西县| 禹城市| 团风县| 金乡县| 南陵县| 瑞安市| 南溪县| 溧阳市| 长岭县| 潜江市| 洛川县| 大同市| 铁岭县| 景德镇市|