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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

我們在微信上24小時(shí)期待你的聲音

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

轉(zhuǎn)載請注明出處:利用PHP高精確度運(yùn)算BC函數(shù)庫解決小數(shù)計(jì)算異常問題 - 微構(gòu)網(wǎng)絡(luò)
分享:
白水县| 磐石市| 西乡县| 黄石市| 全南县| 北安市| 綦江县| 乌拉特中旗| 阿拉尔市| 睢宁县| 醴陵市| 宁波市| 杭锦旗| 汉寿县| 会宁县| 寿宁县| 龙井市| 句容市| 嵊泗县| 墨玉县| 昭平县| 湖北省| 肥城市| 呼伦贝尔市| 武夷山市| 罗城| 长治市| 西充县| 砀山县| 邯郸市| 呼伦贝尔市| 灵武市| 镇江市| 常州市| 无为县| 陆良县| 延安市| 定边县| 兴海县| 东海县| 鄂托克旗|