一、为啥要使用BigDecimal?
为啥:解决小数运算失真问题
double a1=0.1; double b1=0.2; double rs=a1+b1; System.out.println(rs);
运行结果:
用BigDecimal来改进
BigDecimal a=new BigDecimal(Double.toString(0.1)); BigDecimal b=new BigDecimal(Double.toString(0.2)); BigDecimal rs=a.add(b); System.out.println("rs:"+rs);
运行结果:
二、BigDecimal推荐的两种写法
写法一:BigDecimal入参为String类型
BigDecimal a=new BigDecimal(Double.toString(0.1)); BigDecimal b=new BigDecimal(Double.toString(0.2)); BigDecimal rs=a.add(b); System.out.println("rs:"+rs);
运行结果:
写法二:用BigDecimal的valueOf方法(更推荐)
BigDecimal a=BigDecimal.valueOf(0.1); BigDecimal b=BigDecimal.valueOf(0.2); BigDecimal rs=a.add(b); System.out.println("rs:"+rs);
运行结果:
三、BigDecimal的基本操作(加减乘除)
BigDecimal a=BigDecimal.valueOf(0.1); BigDecimal b=BigDecimal.valueOf(0.2); //加操作 BigDecimal rs1=a.add(b); System.out.println("加:"+rs1); //减操作 BigDecimal rs2=a.subtract(b); System.out.println("减:"+rs2); //乘操作 BigDecimal rs3=a.multiply(b); System.out.println("乘:"+rs3); //除操作 BigDecimal rs4=a.divide(b); System.out.println("除:"+rs4);
运行结果:
四、除法精度问题
由于BigDecimal解决的是精度问题,当遇到一个除不尽的数会报错(比如1/3)
问题:
BigDecimal a=BigDecimal.valueOf(0.1); BigDecimal b=BigDecimal.valueOf(0.3); BigDecimal rs=a.divide(b);
运行结果:
解决问题:
BigDecimal a=BigDecimal.valueOf(0.1); BigDecimal b=BigDecimal.valueOf(0.3); BigDecimal rs=a.divide(b,2, RoundingMode.HALF_UP);//保留2位小数,四舍五入 System.out.println("rs:"+rs);
运行结果:
五、将BigDecimal对象转换为double类型的数据
BigDecimal a=BigDecimal.valueOf(0.1); BigDecimal b=BigDecimal.valueOf(0.3); BigDecimal rs=a.divide(b,2, RoundingMode.HALF_UP);//保留2位小数,四舍五入 System.out.println("rs:"+rs); //将BigDecimal对象转换为double类型的数据 double v = rs.doubleValue(); System.out.println("V:"+v);
运行结果: