多么痛的領悟---關于RMB數(shù)據(jù)類型導致的元轉分分轉元的bug處理

關于金額的數(shù)據(jù)類型宗挥,以及元轉分分轉元之間這種轉換乌庶,以及元和分的比較,我相信很多人都踩過坑契耿。
反正我是踩過瞒大。
而且,昨天和今天又重重的踩了兩腳搪桂。

代付查詢接口透敌,支付中心給溢+響應的報文里盯滚,amount的單位是分,這無可厚非酗电,非常合理魄藕。

昨天,負責溢+代付的中威反映撵术,有一單雖然返回的是代付成功的狀態(tài)背率,但因校驗支付中心返回的代付金額與溢+存儲的代付金額不一致,而導致溢+未能更新代付單的狀態(tài)嫩与。

經(jīng)查寝姿,db里代付金額字段的數(shù)據(jù)類型是double,單位是元划滋,程序里對應的pojo也把代付金額的屬性設置為double饵筑。

出問題的那一單的代付金額是1049.11,支付中心響應的代付金額是104910古毛。顯然翻翩,這會致使溢+校驗代付金額失敗。

如下是賦值代碼:

responseModel.setAmount((int) (record.getPayMoney() * 100)); //元轉分

測試發(fā)現(xiàn)稻薇,Double的1049.11經(jīng)這么轉換后嫂冻,果然是104910。拍拍腦袋塞椎,這自然是double的數(shù)據(jù)精度的問題了桨仿。又進一步測試了幾個臨近的數(shù):1049.10→104909,1049.11→104910,1049.12→104911,并且1049.13可以正常轉換為104913

于是案狠,嘗試將代付金額的數(shù)據(jù)類型改為float服傍,經(jīng)測試,改為float是可以的骂铁。之前做結算系統(tǒng)時也遇到過類似問題吹零。由于手頭工作較多,這里不再繼續(xù)了解double和float的區(qū)別了拉庵。

--
走申請灿椅,上線!
--

到了今天下午钞支,溢+那邊又反映茫蛹,說又存在了3筆,支付中心返回了錯誤的代付金額烁挟。

/汗

其中一筆的代付金額是20.38婴洼,支付中心響應給溢+的值是2037。另外還有兩筆撼嗓,151.4→15139柬采;32.85→3284

不能再那么敷衍了欢唾。

同事說之前項目用的都是BigDecimal。我將信將疑警没,寫了個測試用例匈辱,來看看到底BigDecimal與Double/Float取值有哪些不同:

BigDecimal vs Double

BigDecimal vs Float

通過看測試數(shù)據(jù),發(fā)現(xiàn)杀迹,無論BigDecimal/Double/Float亡脸,其intValue()方法,返回的值都是整數(shù)部分树酪, 不會像Math.round()那樣做進行四舍五入浅碾。因為我上面貼出來的那條元轉分的語句,(int) (record.getPayMoney() * 100)等價于(record.getPayMoney() * 100).intValue()续语,所以垂谢,轉換得到的分就會出現(xiàn)因浮點型數(shù)據(jù)精度而導致的少1分的小概率情況。

那天有同事問我為什么interface的方法不用public修飾疮茄,我從OO角度跟他解釋了原因滥朱。 不琢磨,一些簡單的問題也搞不清力试。

而我今天徙邻,也同樣遭遇了他的那種情況。

最后畸裳,因為支付中心是從.net翻版的缰犁,我打開visualstudio,發(fā)現(xiàn)怖糊,.net給代付金額定義的類型也是decimal帅容。于是,果斷將代付金額的數(shù)據(jù)類型重構為BigDecimal伍伤。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末并徘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扰魂,更是在濱河造成了極大的恐慌麦乞,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阅爽,死亡現(xiàn)場離奇詭異路幸,居然都是意外死亡荐开,警方通過查閱死者的電腦和手機付翁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晃听,“玉大人百侧,你說我怎么就攤上這事砰识。” “怎么了佣渴?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵辫狼,是天一觀的道長。 經(jīng)常有香客問我辛润,道長膨处,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任砂竖,我火速辦了婚禮真椿,結果婚禮上,老公的妹妹穿的比我還像新娘乎澄。我一直安慰自己突硝,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布置济。 她就那樣靜靜地躺著解恰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浙于。 梳的紋絲不亂的頭發(fā)上护盈,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音路媚,去河邊找鬼黄琼。 笑死,一個胖子當著我的面吹牛整慎,可吹牛的內容都是我干的脏款。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼裤园,長吁一口氣:“原來是場噩夢啊……” “哼撤师!你這毒婦竟也來了?” 一聲冷哼從身側響起拧揽,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤剃盾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后淤袜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痒谴,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年铡羡,在試婚紗的時候發(fā)現(xiàn)自己被綠了积蔚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡烦周,死狀恐怖尽爆,靈堂內的尸體忽然破棺而出怎顾,到底是詐尸還是另有隱情,我是刑警寧澤漱贱,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布槐雾,位于F島的核電站,受9級特大地震影響幅狮,放射性物質發(fā)生泄漏募强。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一崇摄、第九天 我趴在偏房一處隱蔽的房頂上張望钻注。 院中可真熱鬧,春花似錦配猫、人聲如沸幅恋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捆交。三九已至,卻和暖如春腐巢,著一層夾襖步出監(jiān)牢的瞬間品追,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工冯丙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肉瓦,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓胃惜,卻偏偏與公主長得像泞莉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子船殉,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容