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

實際案例解析在支付模塊中數(shù)學計算問題導致挖坑

2021-03-15 16:01 欄目:技術(shù)開發(fā) 查看(4665)

最近接手了客戶一個去年花了一年時間找省外某軟件公司開發(fā)的一套智能硬件項目,客戶反饋說支付的時候存在報錯,而且強調(diào)以前是沒有問題的。這種情況也是我們最不喜歡接手第三方開發(fā)后的項目升級維護的,因為這個項目在此時我們壓根還沒涉及修改原來系統(tǒng)的相關(guān)模塊,也就不可能是我們的迭代工作造成系統(tǒng)的異常。

QQ截圖20210315150513

根據(jù)分析,這個錯誤信息是系統(tǒng)根據(jù)支付系統(tǒng)接口反饋的錯誤信息,這種錯誤如果支付配置信息沒問題,往往就是發(fā)送的數(shù)據(jù)本身有問題。當筆者根據(jù)客戶反饋的信息進行分析后發(fā)現(xiàn),這個訂單的金額是一個特別的數(shù)字1.1元(這個系統(tǒng)實際正式使用的時候金額都是正整數(shù),不會是小數(shù))??吹竭@個立馬就想到是數(shù)字計算的問題了,結(jié)果查看原系統(tǒng)支付模塊的源代碼,發(fā)現(xiàn)還真是這樣的。

兩個環(huán)節(jié)導致該問題出現(xiàn):

1、由于本系統(tǒng)使用的是銀聯(lián)在線支付通道(聚合銀行卡、微信、支付寶等支付方式),但對于技術(shù)對接上的金額部分,跟微信一樣采用的是以分為單位,比如1.1元,傳給系統(tǒng)的數(shù)據(jù)應(yīng)該是110的整數(shù)。而原來的開發(fā)人員直接把浮點型的金額數(shù)據(jù)乘以100(即金額*100)。

2、在系統(tǒng)向銀聯(lián)在線發(fā)送支付請求是,需要對內(nèi)容數(shù)據(jù)轉(zhuǎn)化成json字符串,在php中使用json_encode方法。

安裝我們正常的數(shù)學邏輯,1.1元換算成分,就是乘以100就行了結(jié)果肯定等于110,也是我們想要的數(shù)據(jù)了。然而在php中,浮點運算是存在精度的問題的,甚至不同php版本運算得到的結(jié)果是不一樣的。比如就以例子中1.1舉例。在PHP7.4版本中得到的結(jié)果如下:

QQ截圖20210315155305

期望的結(jié)果應(yīng)該是{“amount”:110},而實際得到的結(jié)果卻是{“amount”:110.00000000000001}。而且不同的php軟件版本和不同的數(shù)字得到的結(jié)果正確與否的結(jié)果也不同,比如同樣的是php7.4版本下,1.20通過計算得到的結(jié)果跟預期一樣是{“amount”:120}。

所以,這種異常的結(jié)果沒有確定的規(guī)律可言,而且跟我們所需要的預期結(jié)果并不一致,于是在程序計算中必然會存在某些金額導致出錯的情況。

如何解決?

解決的辦法就是在進行數(shù)學運算的時候,我們可以利用一些高精度的計算函數(shù)來完成。比如我們之前就介紹過的BC高精度計算類(關(guān)于這個類的基本使用可以參考我們幾年前分享的文章《利用PHP高精確度運算BC函數(shù)庫解決小數(shù)計算異常問題》),當然除此之外還有更多的工具和方法??偠灾?,我們遇到此類場景的時候切不可隨意為之,否則會讓自己或者你的協(xié)作者掉進大大的坑里。

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

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

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

轉(zhuǎn)載請注明出處:實際案例解析在支付模塊中數(shù)學計算問題導致挖坑 - 微構(gòu)網(wǎng)絡(luò)
分享:
新民市| 安达市| 宿迁市| 麻栗坡县| 舞钢市| 普格县| 昂仁县| 高台县| 彭州市| 内黄县| 乌什县| 沂水县| 新营市| 鄂托克前旗| 徐水县| 沾益县| 东乌珠穆沁旗| 芮城县| 陈巴尔虎旗| 镇原县| 安达市| 葫芦岛市| 双柏县| 钟山县| 东乡族自治县| 枣庄市| 射阳县| 博爱县| 潞城市| 剑河县| 普安县| 郯城县| 涿鹿县| 中卫市| 淅川县| 常州市| 股票| 新津县| 大宁县| 临夏市| 龙海市|