为什么用 bigDecimal 不用 double ?

为什么用 bigDecimal 不用 double ?

double 会出现精度丢失的问题,double 执行的是二进制浮点运算,二进制有些情况下不能准确的表示一个小数,就像十进制不能准确的表示 1/3(1/3=0.3333…),也就是说二进制表示小数的时候只能够表示能够用 1/(2^n)的和的任意组合,但是 0.1 不能够精确表示,因为它不能够表示成为 1/(2^n)的和的形式。

比如:

System.out.println(0.05 + 0.01);
System.out.println(1.0 - 0.42);
System.out.println(4.015 * 100);
System.out.println(123.3 / 100);

输出:
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999

可以看到在 Java 中进行浮点数运算的时候,会出现丢失精度的问题。那么我们如果在进行商品价格计算的时候,就会出现问题。很有可能造成我们手中有 0.06 元,却无法购买一个 0.05 元和一个 0.01 元的商品。因为如上所示,他们两个的总和为 0.060000000000000005。这无疑是一个很严重的问题,尤其是当电商网站的并发量上去的时候,出现的问题将是巨大的。可能会导致无法下单,或者对账出现问题。

而 Decimal 是精确计算 , 所以一般牵扯到金钱的计算 , 都使用 Decimal。

import java.math.BigDecimal;

public class BigDecimalExample {
    public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("0.1");
        BigDecimal num2 = new BigDecimal("0.2");

        BigDecimal sum = num1.add(num2);
        BigDecimal product = num1.multiply(num2);

        System.out.println("Sum: " + sum);
        System.out.println("Product: " + product);
    }
}

//输出
Sum: 0.3
Product: 0.02

在上述代码中,我们创建了两个BigDecimal对象num1num2,分别表示 0.1 和 0.2 这两个十进制数。然后,我们使用add()方法计算它们的和,并使用multiply()方法计算它们的乘积。最后,我们通过System.out.println()打印结果。

这样的使用<code>BigDecimal</code>可以确保精确的十进制数值计算,避免了使用<code>double</code>可能出现的舍入误差。需要注意的是,在创建<code>BigDecimal</code>对象时,应该使用字符串作为参数,而不是直接使用浮点数值,以避免浮点数精度丢失。

「点点赞赏,手留余香」

1

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系maynote@foxmail.com处理
码云笔记 » 为什么用 bigDecimal 不用 double ?

发表回复