" type="hidden"/>

踩坑系列—SqlServer批量新增BigDecimal精度問題


 Insert into ALU_KINGDEE_POWDER_STORE(org_code,verify_date,material_code,material_name,brand,storage,type,weight)VALUES (?,?,?,?,?,?,?,?) , (?,?,?,?,?,?,?,?) ; 
11:51:55 [qtp2014552931-33] DEBUG c.f.c.m.k.A.insertList - ==> Parameters: 14201(String), 2020-12-16T09:18:13.873(String), 10010201010276(String), FA1475(String), 0(String), --(String), 1(String), 60.000000000000(BigDecimal), 14201(String), 2020-12-16T09:20:41.953(String), 10010201010276(String), FA1475(String), 0(String), ---(String), 2(String), 40.000000000000(BigDecimal)
11:51:55 [qtp2014552931-33] DEBUG c.f.c.m.k.A.insertList - <==    Updates: 2

  

insert into alu_bar_kingdee_weight(cinvcode,stockno,stock_weight,org,stock_num)values
		<foreach collection="list" item="item" separator="," index="index">
		(#{item.cinvcode},#{item.stockNo},#{item.stockWeight},#{item.org},#{item.stockNum})
		</foreach>
		;

  

場景:
SqlServer數據庫表A有個字段column1類型為decimal(12,5),javaBean對應的BigDecimal,批量新增數據。
執行insert前打印了數據,column1對應的值都是正常的,但是執行insert后,表中column1的值有些正確有些不正確。

分析:
因為一開始只是發現了個別數據應該是2位小數結果被四舍五入保留了1位小數,就以為是哪里出了問題被統一設置了保留1位小數,但是看了代碼和數據庫精度都沒有特殊設置,而且打印出的數據也是正常的,肯定是在新增數據庫這一步出了問題。
於是把所有數據拉出來核對,發現了不對勁。

批量新增的數據有以下幾種:
(1)column1對應的值小數位都是一樣,比如都是2位
insert A(column1,column2) values(10.28,xxx),(11.24,yyy),(12.51,zzz);
最終數據庫的值都是正常的 說明並沒有被統一設置保留1位小數,因為2位也新增成功了

(2)column1對應的值小數位不一樣,比如有的1位,有的2位
insert A(column1,column2) values(10.28,xxx),(11.2,yyy),(12.51,zzz);
最終數據庫的值有些正確,有些不正確,具體是這樣的:
column1 column2
10.30000 xxx
11.20000 yyy
12.50000 zzz

	10.28變成了10.3        12.51變成了12.5 
  • 1

網上查資料有一篇說了這個問題:批量插入數據時,如果插入的數據精度不統一,最終入庫的數據精度統一按最低的精度入庫
地址如下:https://www.jianshu.com/p/845c1cd10bd9

觀察我出問題的數據,果然是這樣的,小數位一樣的時候沒問題,小數位不一樣的時候都按最低精度比如1位四舍五入了

解決:
在java代碼中將精度設置成統一的,如
new BigDecimal(“10.28”).setScale(5),
new BigDecimal("(11.2").setScale(5),
new BigDecimal(“12.51”).setScale(5),
再次測試批量新增,數據正常:
column1 column2
10.28000 xxx
11.20000 yyy
12.51000 zzz


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM