2022年8月更文挑战1-利用BigDecimal解决精度问题

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

利用BigDecimal解决精度问题

精度异常问题

在开发的过程中,当进行小数运算时有很多情况会出现意外的精度异常问题。常用的小数运算类型float和double分别表示单精度的浮点数和双精度的浮点数。但由于计算机是采用二进制的运算,所以某些十进制数字转化为二进制数字时会出现无法准确表示的情况,也就出现了精度异常的问题。简单看一段代码:

    float a = 0.1f;
    float b = 0.1f;
    System.out.println(a * b);

上述代码的执行结果就会存在精度异常的问题,我们执行的打印结果为0.010000001。

BigDecimal

为了解决精度异常问题,则需要我们本文的主角BigDecimal出场了。BigDecimal在需要准确精度运算的场景中非常常用,它避免了float和double类型在运算过程中存在的精度丢失问题。

BigDecimal b1 = new BigDecimal("0.1");
BigDecimal b2 = new BigDecimal("0.1");
System.out.println(b1.multiply(b2));

如上面的乘法运算,当我们使用BigDecimal时,则可以准确得到计算的结果。而之所以它的结果准确,则是采用另一种计数方法进行计数的,采用无标度值和标度进行处理,而这部分内容可以通过源码获取具体含义。

BigDecimal用法

在使用时我们需要将待计算的数据转化为BigDecimal格式。而在传入时,可以传入string、long、float、double等等很多种类型的数据。但需要注意的是,不推荐将float及double直接通过构造方法传入,由于转化的问题依然可能出现精度丢失,阿里巴巴开发手册中也是明确提到了这一点,小数类型的参数要采用string类型进行传入。

而在进行运算时,有一些常用的操作,例如加、减、乘、除等等则分别采用方法add、subtract、multiply、divide等进行运算。同时,我们可以将得到的计算结果转为各类型的参数,在源码中都可以清晰看到。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。

猜你喜欢

转载自juejin.im/post/7126156319240749092