一、例子
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类的基本使用,赶紧去试试看吧!