slyfox

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

Snag_b0edd2

具有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对象的时候,输出结果更加的让人头大了

分类:

技术点:

相关文章:

  • 2022-12-23
  • 2022-01-13
  • 2021-10-20
  • 2021-10-10
  • 2021-08-23
  • 2021-09-08
  • 2022-12-23
  • 2021-05-15
猜你喜欢
  • 2021-05-27
  • 2021-11-29
  • 2021-06-19
  • 2021-11-18
  • 2022-12-23
  • 2022-12-23
  • 2021-12-04
相关资源
相似解决方案