踩坑系列—SqlServer批量新增BigDecimal精度问题

场景:
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 

网上查资料有一篇说了这个问题:批量插入数据时,如果插入的数据精度不统一,最终入库的数据精度统一按最低的精度入库
地址如下: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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值