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
3public static BigDecimal valueOf(double val) {
return new BigDecimal(Double.toString(val));
}
BigDecimal数据类型初始化
http://example.com/2022/12/04/BigDecimal数据类型初始化/