引入
我们在用基本数据类型double进行运算时,会有这样的问题:
double a = 1;
double b = 0.9;
System.out.println(a-b);
按照我们的数学常识结果应该为:0.1,但实际输出结果为:0.09999999999999998
这是因为double是双精度浮点型,虽然它赋值为0.9,但实际在计算机中存储可能为0.9000000023,那么两个浮点数加减结果肯定会有出入。
然后不管是double还是long都是八个字节,当数据超过一定长度后,就无法保证数据完整了。
BigDecimal
BigDecimal不仅能解决浮点数运算结果问题,还能处理运算位数超过16位的运算。
创建对象
- BigDecimal的构造方法可以直接传入数字字符串或者int、double等基础数据类型创建对象:
BigDecimal bd1=new BigDecimal("1.0");
BigDecimal bd2=new BigDecimal(1);
BigDecimal bd3=new BigDecimal(1.0);
- 两种创建方式的区别在于用字符串创建进行运算能获取期望值:
BigDecimal bd1=new BigDecimal("1.0");
BigDecimal bd2=new BigDecimal("0.9");
BigDecimal r1=bd1.subtract(bd2);
System.out.println(r1); //0.1
- 用基本数据类型创建进行运算能获得更高精度的值:
BigDecimal a = new BigDecimal(1);
BigDecimal b = new BigDecimal(0.9);
System.out.println(a.subtract(b));
//结果为: 0.09999999999999997779553950749686919152736663818359375
加减乘除运算
//BigDecimal,大的浮点数精确计算
BigDecimal bd1=new BigDecimal("1.0");
BigDecimal bd2=new BigDecimal("0.9");
//减法
BigDecimal r1=bd1.subtract(bd2);
System.out.println(r1); //0.1
//加法
BigDecimal r2=bd1.add(bd2);
System.out.println(r2); //1.9
//乘法
BigDecimal r3=bd1.multiply(bd2);
System.out.println(r3); // 0.90
//除法
BigDecimal r4 = new BigDecimal("1.4").subtract(new BigDecimal("0.5"))
.divide(new BigDecimal("0.9"));
System.out.println(r4); // 1
//进行除法时如果除不尽的话,会报异常,此时需要制定模式
BigDecimal r5=new BigDecimal("10").divide(new BigDecimal("3"),2,BigDecimal.ROUND_HALF_UP);
System.out.println(r5); //向上舍 3.33
}