Double型數據的精度問題

1.首先看一個小例子

public static void main(String[] args) {
                 System.out.println(0.05+0.01);
         System.out.println(1.0-0.42);
         System.out.println(4.015*100);
         System.out.println(123.3/100);
    }

運行結果爲:
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
這樣就會導致比較嚴重的問題,在對數據精度要求較高的項目中,比如銀行或者商業交易系統中,餘額的數目就算少0.00000001系統也會認爲你不能進行購買操作,所以我們要對進度進行一定的控制。
此處,採用的是Math包下的BigDecimal進行運算操作。
大概的思路:首先將double型的數據變成String類型的數據,再利用BigDecimal的構造方法將數據變成BigDecimal的對象,最後調用BigDecimal的加減乘除的相關方法,最後將運算結果轉換成double型,
相關代碼如下:`package com.cn.java261;

import java.math.BigDecimal;

public class ArithUtil {
//默認除法運算精度
private static final int DEF_DIV_SCALE=10;
//這個類不能被實例化
private ArithUtil(){

}
public static double add(double a1,double a2){
BigDecimal b1=new BigDecimal(Double.toString(a1));
BigDecimal b2=new BigDecimal(Double.toString(a2));
return b1.add(b2).doubleValue();
}
public static double sub(double a1,double a2){
BigDecimal b1=new BigDecimal(Double.toString(a1));
BigDecimal b2=new BigDecimal(Double.toString(a2));
return b1.subtract(b2).doubleValue();
}
public static double mul(double a1,double a2){
BigDecimal b1=new BigDecimal(Double.toString(a1));
BigDecimal b2=new BigDecimal(Double.toString(a2));
return b1.multiply(b2).doubleValue();
}
public static double div(double a1,double a2){
return div(a1,a2,DEF_DIV_SCALE);
}
public static double div(double a1,double a2,int scale){
if(scale<0){
throw new IllegalArgumentException(“The scale must be a positive integer or zero”);
}
BigDecimal b1=new BigDecimal(Double.toString(a1));
BigDecimal b2=new BigDecimal(Double.toString(a2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
`
測試類的代碼:

package com.cn.java261;

public class T1 {

    public static void main(String[] args) {
         System.out.println(ArithUtil.add(0.05,0.01));
         System.out.println(ArithUtil.sub(1.0,0.42));
         System.out.println(ArithUtil.mul(4.015,100));
         System.out.println(ArithUtil.div(123.3,100));
    }

}

結果爲:
0.06
0.58
401.5
1.233

大概就這麼多了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章