问题如下:当数据相加等于0.3、0.6等时就会失去精度,直接打印0.3是没有问题的
public static void main(String[] args) {
Double d1 = 0.1;
Double d2 = 0.1;
Double d3 = 0.1;
Double d4 = 0.3;
//直接d1+d2+d3 = 0.30000000000000004
System.out.println(d1+d2+d3);
//d1+d2 = 0.2
System.out.println(d1+d2);
//d4 = 0.3
System.out.println(d4);
//直接d1+d2+d3+d1+d4 = 0.7
System.out.println(d1+d2+d3+d1+d4);
//直接d1+d2+d3+d4 = 0.6000000000000001
System.out.println(d1+d2+d3+d4);
}
//转化为bigDeiceml
public static void main(String[] args) {
Double d1 = 0.1;
Double d2 = 0.1;
Double d3 = 0.1;
Double d4 = 0.3;
//直接d1+d2+d3 = 0.3
System.out.println(doubleAdd(d1,d2,d3));
//d1+d2 = 0.2
System.out.println(doubleAdd(d1,d2));
//d4 = 0.3
System.out.println(d4);
//直接d1+d2+d3+d1+d4 = 0.7
System.out.println(doubleAdd(d1,d2,d3,d1,d4));
//直接d1+d2+d3+d4 = 0.6
System.out.println(doubleAdd(d1,d2,d3,d4));
}
/**
* 封装个方便调用的方法
*
* @param d1
* @param d2
* @return
*/
public static Double doubleAdd(Double d1,Double d2){
//这里一定要将double数据转化为String后再转化bigDecimal 不然数据计算还是会失去精度
BigDecimal decimal1 = new BigDecimal(Double.toString(d1));
BigDecimal decimal2 = new BigDecimal(Double.toString(d2));
return decimal1.add(decimal2).doubleValue();
}
/**
* 封装个方便多数值相加的方法
* @param d
* @return
*/
public static Double doubleAdd(Double... d){
return Arrays.stream(d).reduce((a, b) -> doubleAdd(a, b).doubleValue()).get();
}