float和double類型主要是為了科學(xué)計算而設(shè)計的,它們并沒有提供完全精確的結(jié)果,所以不應(yīng)該被用于需要精確結(jié)果的場合。
對于此,在大多數(shù)的商業(yè)計算中,一般采用BigDecimal來進(jìn)行精確計算。
BigDecimal的使用步驟如下:
1.初始化一個BigDecimal對象,兩種方法都可行
BigDecimal bd1 = new BigDecimal(Double.toString(0.123));
BigDecimal bd2 = BigDecimal.valueOf(0.123);
2.具體運(yùn)算方法如下:
public BigDecimal add(BigDecimal value); //加法
public BigDecimal subtract(BigDecimal value); //減法
public BigDecimal multiply(BigDecimal value); //乘法
public BigDecimal divide(BigDecimal value); //除法
對于除法,要考慮除不盡的情況,因此需要指定保留小數(shù)位和取值策略的問題。
計算結(jié)束后,如果我們需要將BigDecimal對象轉(zhuǎn)換成相應(yīng)的基本數(shù)據(jù)類型的變量,可以使用floatValue(),doubleValue()等方法。
現(xiàn)在我們就來封裝一個BigDecimal運(yùn)算工具類,下次直接調(diào)用即可
public class BigDecimalUtil {
private BigDecimalUtil(){
}
public static BigDecimal add(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2);
}
public static BigDecimal sub(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2);
}
public static BigDecimal mul(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2);
}
public static BigDecimal div(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,2,BigDecimal.ROUND_HALF_UP);//四舍五入,保留2位小數(shù)
//除不盡的情況
}
}