掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
現(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ù),具體如下:
以上函數(shù)具體內(nèi)容可以參考PHP官方文檔關(guān)于BC函數(shù)庫的介紹:
http://php.net/manual/zh/ref.bc.php
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流