BigDecimal在金额计算中丢失精度问题
程序员文章站
2022-07-15 13:39:11
...
一、问题现象:
我们在使用金额计算或者展示金额的时候经常会使用BigDecimal,这个类型也是涉及金额时非常推荐的一个类型,BigDecimal也提供了很多构造器方法,这些构造器方法使用不当可能会造成不必要的麻烦甚至是金额损失,如下图所示:
Android收银台页面也曾出现过这个bug,显示一个非常长的数字,幸好只是展示,不涉及计算和存储。
二、问题分析:
先看下BigDecimal提供的部分构造器方法
public BigDecimal(double val) {
this(val,MathContext.UNLIMITED);
}
public BigDecimal(String val) {
this(val.toCharArray(), 0, val.length());
}
public BigDecimal(int val) {
this.intCompact = val;
this.scale = 0;
this.intVal = null;
}
通过测试发现当使用double或者float这些浮点数据类型时,会丢失精度,String、int则不会;
查阅double构造方法时发下调用了一个native方法:
查阅了一些资料如下,该计算方式会导致精度丢失。
三、总结:
初始化BigDecimal值或者赋值时建议采用String类型,即使数据再大再长也不会丢失精度。
下一篇: Liferay 之 二 增删改查