精确计算——BigDecimal的使用

本文介绍了在实际开发中,由于double和float等类型存在的计算误差,如何使用BigDecimal进行精确计算。详细讲解了BigDecimal的构造方法,特别是推荐使用String参数的构造方法,以及其加、减、乘、除等常用方法的使用示例,特别强调了除法在不同情况下的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、例子

double a = 10.0;
double b = 3.0;
System.out.println( a / b );

        在上面这个例子中,你觉得答案应该是多少? 有的人说这不简单 不就是3.33333....一直循环吗?但是我们看一下运行结果,可能你会大吃一惊:

        我们可以看到,计算出来的程序是有误差的。 我们再来看一个例子:

double a = 0.1;
double b = 0.2;
System.out.println( a + b );

我们看到的结果,同样也是不准。

二、实际开发带来的麻烦

        假如开发的是金融、电商行业的系统,那么对数据的精确度要求是非常高的。因此Java的基本类型 double、int、float是远远不能够满足计算的精确度的。

三、BigDecimal的常用构造方法

        为了满足对计算精确度的要求,Java提供了一个精确计算的类BigDecimal。这个类给我们提供了两个常用的构造方法,分别是:

        1、 public BigDecimal(double val) 

        2、 public BigDecimal(String val)

       具体的代码使用如下:

BigDecimal bd1 = new BigDecimal(10.0);
BigDecimal bd2 = new BigDecimal("10.0");
System.out.println(bd1);
System.out.println(bd2);

        运行结果如下:

        

        但是,我们推荐你使用第二个构造方法,也就是传入的参数是String类型的构造方法。 为什么呢?请继续往下看!

 四、BigDecimal的常用方法

        1、加法:public BigDecimal add(BigDecimal augend) 

BigDecimal bd1 = new BigDecimal(0.2);
BigDecimal bd2 = new BigDecimal(0.1);
BigDecimal add = bd1.add(bd2);
System.out.println(add);

        运行以后,你会发现以下的结果:

        

         这个时候,你会说:骗子!这不还是不精确吗?别急,我们尝试着将构造方法换成String类型参数的构造方法。具体代码如下:

BigDecimal bd1 = new BigDecimal("0.2");
BigDecimal bd2 = new BigDecimal("0.1");
BigDecimal add = bd1.add(bd2);
System.out.println(add);

        擦亮眼睛,我们来见证一下奇迹:

        它终于出来了!!!没错,我们通过BigDecimal类和add方法,就实现了两个小数的精确计算了。接下来我们继续看一下:减法和乘法。

         2、减法:public BigDecimal subtract(BigDecimal subtrahend)

BigDecimal bd1 = new BigDecimal("0.2");
BigDecimal bd2 = new BigDecimal("0.1");
BigDecimal subtract = bd1.subtract(bd2);
System.out.println(subtract);

        运行结果:

         

        3、乘法:public BigDecimal multiply(BigDecimal multiplicand)

BigDecimal bd1 = new BigDecimal("0.2");
BigDecimal bd2 = new BigDecimal("0.1");
BigDecimal multiply = bd1.multiply(bd2);
System.out.println(multiply);

         运行结果:

        

五、BigDecimal的除法 

        除法:public BigDecimal divide(BigDecimal divisor)

1、整除情况:

        对于除得尽的情况,大家直接看一下代码就可以一目了然了!

BigDecimal bd1 = new BigDecimal("0.2");
BigDecimal bd2 = new BigDecimal("0.1");
BigDecimal divide = bd1.divide(bd2);
System.out.println(divide);

运行结果:

 

2、除不尽的情况:

        对于除不尽的情况,如果直接使用上面的那一段代码,他会直接报错。

BigDecimal bd1 = new BigDecimal("10.0");
BigDecimal bd2 = new BigDecimal("3.0");
BigDecimal divide = bd1.divide(bd2);
System.out.println(divide);

        会报java.lang.ArithmeticException异常

 3、除不尽的情况应当使用以下方法:

        public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

        divisor:被除数

        scale:保留几位小数

        roundingMode:保留小数采用的策略(

                BigDecimal.ROUND_UP:进一法;

                BigDecimal.ROUND_FLOOR:去尾法;

                BigDecimal.ROUND_HALF_UP:四舍五入法

      这里我们就演示我们熟悉的四舍五入法,如果你感兴趣的话去试试其他两种常用策略:

BigDecimal bd1 = new BigDecimal("10.0");
BigDecimal bd2 = new BigDecimal("3.0");
BigDecimal divide = bd1.divide(bd2,2,BigDecimal.ROUND_HALF_UP);
System.out.println(divide);

运行结果如下:

以上就是关于BigDecimal类的基本使用,赶紧去试试看吧!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyc&阿灿

喜欢的话 给个支持吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值