2016-01-11 37 views
1

我發現使用十進制格式,並四捨五入顯示模式一些值十進制格式舍入模式產生不一致的值

double b = 123.135; 
    //double b = 1896.675; 
    //double b = 523.135; 

    DecimalFormat df = new DecimalFormat(".##"); 
    df.setRoundingMode(RoundingMode.HALF_UP); 
    System.out.println(b); 
    String a = df.format(b); 
    System.out.println(a); 

    double roundOff = Math.round(b * 100.0)/100.0; 
    System.out.println(roundOff); 

主要生產出現意外的行爲:

123.135 
123.14 
123.14 

我相信這是正確的。

在使用這個值:1896.675產生如下:

1896.675 
1896.67 
1896.68 

這一點我認爲是意想不到的 - 我在做什麼錯在這裏?

+1

設置的BigDecimal BD =新的BigDecimal(二);並打印bd結果1896.674999999999954525264911353588104248046875,我猜是接近存儲的實際值。 – user3284549

回答

2

問題在於,由於二進制格式的限制,不可能將所有可能的分數存儲在變量中。所以基本上雙倍剛剛接近你輸入的值,這就是爲什麼發生舍入錯誤。 你可以閱讀更多關於這個主題的,例如這個線程:how does java.math.RoundingMode work?

長話短說,如果你想精確舍入使用的BigDecimal(BigDecimal類和的valueOf功能)

+1

請注意,即使BigDecimal只給出確切的結果,如果涉及的每個數字都可以精確地表示爲小數部分。例如,它不能完全表示將1除以3​​的結果。 –