Java中对浮点型数据的精确处理
1.普通的double,float型数据处理会使精度丢失
2.使用BigDecimal 处理会让精度保留
//对浮点类型的准确处理(常用于银行等精确计算的数据)
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;
public class BigDecimalTest {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal("0.05");//构造器是字符串String类型(一定要这样做)
BigDecimal b2 = BigDecimal.valueOf(0.01); //创建BigDecimal对象,静态方法
BigDecimal b3 = new BigDecimal(0.05);// 一般不这样做,这样做的数不准确,传入的是一个近似值
System.out.println("使用String类型作为参数");
System.out.println("0.05+0.01=" + b1.add(b2));
System.out.println("使用double类型作为构造器的参数");
System.out.println("0.05+0.01=" + b3.add(b2));
//封装一些方法
Scanner in = new Scanner(System.in);
System.out.println("请输入两个浮点数:");
double a = in.nextDouble();
double b = in.nextDouble();
System.out.println("a+b=" + add(a, b));
System.out.println("a/b=" + div(a, b));
}
//加法运算
public static double add(double d1, double d2) {
BigDecimal b1 = BigDecimal.valueOf(d1);
BigDecimal b2 = BigDecimal.valueOf(d2);
return b1.add(b2).doubleValue(); //最终要转换成doubleL类型
}
//除法运算
public static double div(double d1, double d2) {
BigDecimal b1 = BigDecimal.valueOf(d1);
BigDecimal b2 = BigDecimal.valueOf(d2);
return b1.divide(b2, 20, RoundingMode.HALF_UP).doubleValue(); //相对精确,当除不尽的时候可以保留小数点后20位,然后四舍五入
}
}
备注:创建BigDecimal 对象时,不会直接使用double型浮点数作为构造器的参数来调用构造器,否则同样会让精度丢失。