BigDecimal数据类型初始化

BigDecimal数据类型初始化

错误:

  • 在某个表中开发的导入功能,对于指标类型的数据不一定全部都是整数,所以设置为BigDecimal类型,但是在测试数据时却显示下面的形式,但是输入的是99.8

原因:

  • BigDecimal为大数据类型,更精准的计算,初始化的时候将Excel中获取的数据通过cell.getNumericCellValue()方法转化成了double类型的,所以就导致数据出现64位失真
  • 给出的数值,在大多数情况下需要比64bit更多的位数才能准确表示出来(甚至是需要无穷多位),而double类型的数值只有64bit,后面舍去的位数一定会带来误差,无法得到“数学上精确”的结果。

解决办法:

注意1
  • BigDecimal(double val)这个构造方法有时是无法精确预料的,因为double类型无法精确地存储0.1,所以说通过double类型初始化的BigDecimal类型,是不精确的。最好用String类型的数值字符串来初始化。 String 构造方法是完全可预知的:写入 newBigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的 0.1。
注意2
  • 如果必须使用double类型的数据,那就是用方法三的初始化方法
    1
    2
    3
    4
    5
    6
    // 方法1,错误
    BigDecimal a = new BigDecimal(0.1);
    // 方法2
    BigDecimal b = new BigDecimal("0.1");
    // 方法3
    BigDecimal c = BigDecimal.valueOf(0.1);
  • 因为第三种就是第二种的封装
    1
    2
    3
    public static BigDecimal valueOf(double val) {
    return new BigDecimal(Double.toString(val));
    }

BigDecimal数据类型初始化
http://example.com/2022/12/04/BigDecimal数据类型初始化/
作者
陈佳乐
发布于
2022年12月4日
许可协议