1. 程式人生 > >double型別四捨五入問題

double型別四捨五入問題

在開發中,對double型別數字四捨五入時,寫了一個方法,如下

/**
* 設定double數字格式
* @param val
* @param newScale
* @return
*/
public double doubleDeal(double val){
double number = 0.00;
DecimalFormat df = new DecimalFormat("#.00");
number = Double.parseDouble(df.format(val));
return number;
}

/**
* 設定是數字型別的字串格式
* @param val
* @param newScale
* @return
*/
public double doubleDeal(String val){
double number = 0.00;
if (val == null || "".equals(val)) {
val = "0";
}
try{
number = Double.parseDouble(val);
}catch (Exception ex) {
val = "0";
}
DecimalFormat df = new DecimalFormat("#.00");
number = Double.parseDouble(df.format(number));
        return number;
}

但是程式執行時,發現對與四捨五入會出現問題如下

public static void main(String[] args){
new WorkloadReviewCheck().doubleDeal(-4.684);
new WorkloadReviewCheck().doubleDeal(-4.674);
new WorkloadReviewCheck().doubleDeal(-4.685);//
new WorkloadReviewCheck().doubleDeal(-4.675);
new WorkloadReviewCheck().doubleDeal(-4.686);
new WorkloadReviewCheck().doubleDeal(-4.676);
new WorkloadReviewCheck().doubleDeal(-4.655);
new WorkloadReviewCheck().doubleDeal(-4.645);//
}

會出現如果第二位為偶數第三位為5則五舍六入的問題。

經過查詢資料發現  

DecimalFormat df = new DecimalFormat("#.00");
java預設的格式是HALF_EVEN   根據如果第二位為偶數第三位為5則五舍六入

對這個方法該進

/**
* 設定double數字格式
* @param val
* @param newScale
* @return
*/
public double doubleDeal(double val){
double number = 0.00;
DecimalFormat df = new DecimalFormat("#.00");
//java預設的格式是HALF_EVEN   根據如果第二位為偶數第三位為5則五舍六入
df.setRoundingMode(RoundingMode.HALF_UP);
number = Double.parseDouble(df.format(val));
return number;
}

可實現四捨五入