昨天业务找过来说业务上的金额不对,查了日志才知道渠道送过来的数据,由于金额比较大自动转成科学计数了,金额是18882138.23,结果转成1.888213823E7了。问了那边才知道他们使用的是double类型;
一、发生场景
整数位超过7位时,就会自动转成科学计数;下面我们来看下
@PostMapping(value = "findGoods") public Goods getValue(){ Goods goods=new Goods(); double premiun=18882138.23; goods.setName("超级计算机"); goods.setPremium(premiun); return goods; }
使用Postman来调一下,响应结果:
{ "name": "超级计算机", "premium": 1.888213823E7 }
二、解决方案
使用BigDecimal代替
@PostMapping(value = "findGoods1") public Goods getValue1(){ Goods goods=new Goods(); BigDecimal premiun=new BigDecimal("18882138.23").setScale(2); goods.setName("超级计算机"); goods.setPremium1(premiun); return goods; }
setScale()方法设置小数点后保留位数
大家有使用到BigDecimal要转字符串场景时,要注意调用其toPlainString()方法进行转化,不然某些场景下时,也会发生自动转为科学计数的情况;
网上搜了很多文章,大家都是乱抄乱套的,验证了一下根本就不会出现转科学计数的情况,后面看到一篇文章,大家有兴趣可以参考一下进行研究;BigDecimal科学计数场景