欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

BigDecimal在金额计算中丢失精度问题

程序员文章站 2022-07-15 13:39:11
...

一、问题现象:

我们在使用金额计算或者展示金额的时候经常会使用BigDecimal,这个类型也是涉及金额时非常推荐的一个类型,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在金额计算中丢失精度问题

查阅了一些资料如下,该计算方式会导致精度丢失。

BigDecimal在金额计算中丢失精度问题

三、总结:

初始化BigDecimal值或者赋值时建议采用String类型,即使数据再大再长也不会丢失精度。

相关标签: ★基础