for循環(huán)進行相加的時候會出現(xiàn)下面的問題:
777.76 + 155.56 =933.3199999999999
而不是我們希望的數(shù)值:933.32
原因是:
Java中的簡單浮點數(shù)類型float和double不能夠進行運算,因為大多數(shù)情況下是正常的,但是偶爾會出現(xiàn)如上所示的問題刀森。這個問題其實不是JAVA的bug杠览,因為計算機本身是二進制的,而浮點數(shù)實際上只是個近似值当宴,所以從二進制轉(zhuǎn)化為十進制浮點數(shù)時畜吊,精度容易丟失,導(dǎo)致精度下降即供。
解決辦法:
要保證精度就要使用BigDecimal類定拟,而且不能直接從double直接轉(zhuǎn)BigDecimal,要將double轉(zhuǎn)string再轉(zhuǎn)BigDecimal逗嫡。也就是不能使用BigDecimal(double val) 方法青自,你會發(fā)現(xiàn)沒有效果。要使用BigDecimal(String val) 方法驱证。
例子:
加法:
public static double add(double a1, double b1) {
BigDecimal a2 = new BigDecimal(Double.toString(a1));
BigDecimal b2 = new BigDecimal(Double.toString(b1));
return a2.add(b2).doubleValue();
}
減法:
public static double sub(double a1, double b1) {
BigDecimal a2 = new BigDecimal(Double.toString(a1));
BigDecimal b2 = new BigDecimal(Double.toString(b1));
return a2.subtract(b2).doubleValue();
}
乘法:
public static double mul(double a1, double b1) {
BigDecimal a2 = new BigDecimal(Double.toString(a1));
BigDecimal b2 = new BigDecimal(Double.toString(b1));
return a2.multiply(b2).doubleValue();
}
除法:
public static double div(double a1, double b1, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("error");
}
BigDecimal a2 = new BigDecimal(Double.toString(a1));
BigDecimal b2 = new BigDecimal(Double.toString(b1));
return a2.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
scale參數(shù)為除不盡時延窜,指定精度。