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;
}
可實現四捨五入