支付交易中遇到浮點數精度的問題

2021-10-18 16:33:00 字數 732 閱讀 2656

1,案例

支付平台的單位是分,而業務系統的單位是元,所以傳到支付系統時要乘以100

@test

public void test_divide2()

執行結果:1010.99994

執行結果不精確!!!

但是預期結果是:1011

2,解決方法:使用bigdecimal

@test

public void test_divide()

執行結果:

使用bigdecimal

最後

以上就是一種對於支付系統金錢資料精度丟失的解決方式,大概核心總結為以下幾點

不採用float、double而採用bigdecimal進行代替運算(如果採用bigdecimal運算構造引數需要以字串形式,否則還是有可能出現精度丟失問題)

對外採用string型別,為防止前後端json互動導致的精度丟失問題

內部進行運算時先轉為分進行運算,這樣可以避免運算導致的精度丟失問題

資料庫採用bigdecimal切不設定小數為進行儲存

浮點數精度問題

一 例子 首先我們去編譯器試試 double a 1.9 通過新增監視檢視a的值 會發現a的值是1.8999999 二 開始今天的學習 在最開始學c 的時候並沒有對浮點數進行很深入的學習,認為浮點不就是小數嘛,首先在c 的巨集裡面有 flt max 和 flt min 的定義,float是四位元組的...

浮點數的精度問題

float 1bit 符號位 8bits 指數字 23bits 尾數字 double 1bit 符號位 11bits 指數字 52bits 尾數字 對於二進位制的小數 1.1 1 20 1 2 1 1 1 2 1.5 1.01 1 20 0 2 1 1 2 2 1 1 4 1.25 1.0011 1...

浮點數精度丟失問題

c 中的浮點數,分單精度 float 和雙精度 double float 是 system.single 的別名,介於 3.402823e38 和 3.402823e38 之間的32位數字,符合二進位制浮點演算法的 iec 60559 1989 ieee 754 標準 double 是 system...