double型別資料做加和操作時會丟失精度問題處理
int a = 3;
double b = 0.03;
double c = 0.03;
double d = a + b + c;
System.out.println("first d:" + d);
結果:first d:3.0599999999999996
如果用java.math包中的BigDecima類並用String來構造加和操作則結果會保持正確。操作如下:
public class TestBigDecimalDemo {
/**
* 測試BigDecimal 在進行算數計算時不會丟失精度。--一般的數值型別在進行 金融類資料計算時會丟失精度。
* @param args
*/
public static void main(String[] args) {
// double result = add(1.00000000000000001, 1.00000000000000001);
// //result = 2.0 丟失了精度
// System.out.println(result);
int a = 3;
double b = 0.03;
double c = 0.03;
//不會丟失精度
double d = add(add(a, b),c);
System.out.println("first d:" + d);
//會丟失精度
d = a+b+c;
System.out.println("second d:" + d);
}
/**
* 加法運算
* @param m1
* @param m2
* @return
*/
public static double add(double m1, double m2) {
BigDecimal p1 = new BigDecimal(Double.toString(m1));
BigDecimal p2 = new BigDecimal(Double.toString(m2));
return p1.add(p2).doubleValue();
}
/**
* 減法運算
* @param m1
* @param m2
* @return
*/
public static double sub(double m1, double m2) {
BigDecimal p1 = new BigDecimal(Double.toString(m1));
BigDecimal p2 = new BigDecimal(Double.toString(m2));
return p1.subtract(p2).doubleValue();
}
/**
* 乘法運算
* @param m1
* @param m2
* @return
*/
public static double mul(double m1, double m2) {
BigDecimal p1 = new BigDecimal(Double.toString(m1));
BigDecimal p2 = new BigDecimal(Double.toString(m2));
return p1.multiply(p2).doubleValue();
}
/**
* 除法運算
* @param m1
* @param m2
* @param scale
* @return
*/
public static double div(double m1, double m2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("Parameter error");
}
BigDecimal p1 = new BigDecimal(Double.toString(m1));
BigDecimal p2 = new BigDecimal(Double.toString(m2));
return p1.divide(p2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
輸出結果為:3.06