Java-从Double类型精度丢失认识BigDecimal

时间:2023-03-08 22:36:08

Java-从Double类型精度丢失认识BigDecimal

参考资料

Double类型丢失精度

public static void main(String[] args) {
double value = 0.05 + 0.01;
System.out.println(value);
//0.060000000000000005
}

double 类型的 0.05 + 0.01 的结果我们猜想的应该是 0.06 但是程序的数据结果却是大大的超出了我们的预料(我们称这种现象为精度丢失),造成上面的这种情况的原因是小数在计算机中的存储形式造成的。

精度丢失的原因不是本篇博客的主要内容,所以在这里不再赘述,想要了解的可以查看,文章顶部的 IEEE 754 的规范。

double 类型存在着上面的这种问题,所以我们肯定是不能用它来进行特别精细的计算了,比如 科学研究金融 相关的业务逻辑。因为一旦数据不精确就可能造成比较严重的问题。

BigDecimal

既然出现了上面的这种问题,肯定是有解决办法的,官方提供的解决办法就是 BigDecimal 类。

与BigDecimal类似的还有BigInteger类.

构造BitDecimal

Java-从Double类型精度丢失认识BigDecimal

具有char[]参数的构造方法我们一般是不会去主动调用的,因为当我们调用具有string参数的构造函数时,会间接地调用char[]参数的构造方法。

public BigDecimal(String val) {
this(val.toCharArray(), 0, val.length());
}

在构建BigDecimal的时候推荐使用String参数的构造方法,因为double参数的构造方法会会出现一些问题。

public static void main(String[] args) {
BigDecimal bigDecimal = new BigDecimal(0.06);
System.out.println(bigDecimal); BigDecimal bigDecimalStr = new BigDecimal("0.06");
System.out.println(bigDecimalStr);
}

输出结果如下

0.059999999999999997779553950749686919152736663818359375
0.06

通过输出结果我们发现,当通过double参数的构造方法的来创建BigDecimal对象的时候,输出结果更加的让人头大了