目录
BigDecimal类的概述
使用基本类型做浮点数运算精度问题
看程序说结果:
public static void main(String[] args) {
// 小数运算精度问题:
System.out.println(0.09 + 0.01);
// 期望:0.10 很遗憾,结果并不是期望值,而是一个无限趋近期望值的小数
System.out.println(1.0 - 0.32);
// 期望:0.68 很遗憾,结果并不是期望值,而是一个无限趋近期望值的小数
System.out.println(1.015 * 100);
// 期望:101.5 很遗憾,结果并不是期望值,而是一个无限趋近期望值的小数
System.out.println(1.301 / 100);
// 期望:0.01301 很遗憾,结果并不是期望值,而是一个无限趋近期望值的小数
}
-
对于浮点运算,不要使用基本类型,而使用"BigDecimal类"类型
-
java.math.BigDecimal(类):提供了更加精准的数据计算方式。
BigDecimal类构造方法
注意:推荐使用第二种方式,第一种存在精度问题
// 构造方法
private static void method01() {
// 创建BigDecimal对象
BigDecimal b1 = new BigDecimal("0.09");
BigDecimal b2 = new BigDecimal("0.01");
System.out.println(b1.add(b2));// 0.10 没有精度问题
// 创建BigDecimal对象
// BigDecimal b1 = new BigDecimal(0.09);
// BigDecimal b2 = new BigDecimal(0.01);
// 由此可发现使用BigDecimal(double val)创建出来的对象,发生数学运算还是有精度问题
// System.out.println(b1.add(b2));
// 0.09999999999999999687749774324174723005853593349456787109375
}
BigDecimal类常用方法
BigDecimal类中使用最多的还是提供的进行四则运算的方法,如下:
注意:对于divide方法来说,如果除不尽的话,就会出现java.lang.ArithmeticException异常。此时可以使用divide方法的另一个重载方法;
BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode): divisor:除数对应的BigDecimal对象;scale:精确的位数;roundingMode取舍模式
RoundingMode枚举: RoundingMode.HALF_UP 四舍五入
public class Test {
public static void main(String[] args) {
// 加法:
// 创建BigDecimal对象
BigDecimal b1 = new BigDecimal("0.09");
BigDecimal b2 = new BigDecimal("0.01");
BigDecimal res1 = b1.add(b2);
System.out.println(res1);// 0.10
System.out.println("===========================");
// 减法:
// 创建BigDecimal对象
BigDecimal b3 = new BigDecimal("1.0");
BigDecimal b4 = new BigDecimal("0.32");
BigDecimal res2 = b3.subtract(b4);
System.out.println(res2);// 0.68
System.out.println("===========================");
// 乘法:
// 创建BigDecimal对象
BigDecimal b5 = new BigDecimal("1.015");
BigDecimal b6 = new BigDecimal("100");
BigDecimal res3 = b5.multiply(b6);
System.out.println(res3);// 101.500
System.out.println("===========================");
// 除法:
// 创建BigDecimal对象
BigDecimal b7 = new BigDecimal("1.301");
BigDecimal b8 = new BigDecimal("100");
BigDecimal res4 = b7.divide(b8);
System.out.println(res4);// 0.01301
}
}
// BigDecimal类的注意事项:
public class Test2 {
public static void main(String[] args) {
// 创建BigDecimal对象
BigDecimal b1 = new BigDecimal("10");
BigDecimal b2 = new BigDecimal("3");
//BigDecimal res = b1.divide(b2);// 报ArithmeticException运算异常
BigDecimal res = b1.divide(b2, 2, RoundingMode.HALF_UP);
System.out.println(res);// 3.33
}
}
除法保留三位小数代码实例
BigDecimal b1=new BigDecimal("1.302");
BigDecimal b2=new BigDecimal("0.013");
//保留三位小数
BigDecimal divide = b1.divide(b2, 3, BigDecimal.ROUND_HALF_UP);
System.out.println(divide);
除法保留三位有效数字代码实例
BigDecimal divide1 = b1.divide(b2, new MathContext(3));
System.out.println(divide1);
乘法保留两位小数
BigDecimal b1 = new BigDecimal("12.221");
BigDecimal b2 = new BigDecimal("1.21");
BigDecimal m1 = b1.multiply(b2);
BigDecimal bigDecimal1 = m1.setScale(2, RoundingMode.HALF_UP);
System.out.println(bigDecimal1);
乘法保留两位有效数字
System.out.println(b1.multiply(b2, new MathContext(2)));