一、double类型数据加减操作精度丢失解决方法
double类型数据加减运算时,会出现精度缺失。
打个比方
double number1 = 1;
double number2 = 0.2;
double number3 =number1 + number2 ;
理论上number3会等于1.2;但是在实际的操作过程中会出现1.299999999999这种情况,这就是double类型的数据进行计算时出现精度缺失。
解决方法是使用java.math.BigDecimal进行计算。
/**
* 加法运算
* @param number1
* @param number2
* @return
*/
public static double addDouble(double number1 , double number2) {
BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(number1));
BigDecimal bigDecimal2 = new BigDecimal(String.valueOf(number2));
return bigDecimal1.add(bigDecimal2).doubleValue();
}
/**
* 减法运算
* @param number1
* @param number2
* @return
*/
public static double subDouble(double number1, double number2) {
BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(number1));
BigDecimal bigDecimal2 = new BigDecimal(String.valueOf(number2));
return bigDecimal1.subtract(bigDecimal2).doubleValue();
}
/**
* 乘法运算
* @param number1
* @param number2
* @return
*/
public static double mul(double number1, double number2) {
BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(number1));
BigDecimal bigDecimal2 = new BigDecimal(String.valueOf(number2));
return bigDecimal1.multiply(bigDecimal2).doubleValue();
}
/**
* 除法运算
* @param num
* @param total
* @return
*/
public static BigDecimal divide(double num, double total) {
BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(num));
BigDecimal bigDecimal2 = new BigDecimal(String.valueOf(total));
return bigDecimal1.divide(bigDecimal2, 2, BigDecimal.ROUND_HALF_UP);;
}
参考:Java中double类型精度丢失的问题_double类型数据加减操作精度丢失解决方法_BigDecimal取整_Archie_java的博客-CSDN博客_double相加丢失精度
二、BigDecimal进行加减乘除的基本用法
BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。
import java.math.BigDecimal;
public class T {
public static void main(String[] args) {
String a = "9999.9999";
int b = 9999;
double c = 9999.9999;
char d = 99;
System.out.println("===================");
// 不同类型转为BigDecimal
BigDecimal ma = new BigDecimal(a);
BigDecimal mb = new BigDecimal(b);
BigDecimal mc = new BigDecimal(c);
BigDecimal md = new BigDecimal(d);
System.out.println("ma:"+ma.toString());
System.out.println("mb:"+mb.toString());
System.out.println("mc:"+mc.toString());
System.out.println("md:"+md.toString());
System.out.println("===================");
// 加
BigDecimal add = ma.add(mb);
System.out.println("加法:"+add);
// 减
BigDecimal sub = ma.subtract(mb);
System.out.println("减法:"+sub);
// 乘
BigDecimal mul = mb.multiply(md);
System.out.println("乘法:"+mul);
// 除
BigDecimal div = mb.divide(md);
System.out.println("除法:"+div);
}
}
参考:https://blog.csdn.net/weixin_35327395/article/details/114615373