2012-06-28 57 views
0

爲了圓的數我使用以下代碼:舍入BigDecimal與所述setScale()方法:意想不到的結果

public static roundBd(BigDecimal bd){ 
    BigDecimal result1 = bd.setScale(0, RoundingMode.HALF_UP); 
    return result1; 
} 
  • 輸入1.50 - >輸出2
  • 輸入1.499 - >輸出1

第一個結果對我來說沒問題,但第二個結果並不符合我的預期。即使對於1.499 我想有在輸出2(在細節:首先我想然後到1.499舍入到1.50至1.5,最後到2)

但是....

BigDecimal bd = new BigDecimal("1.499"); // I'd like to round it to 2 
BigDecimal result1 = bd.setScale(2, RoundingMode.HALF_UP); // result1 == 1.50 
BigDecimal result2 = bd.setScale(1, RoundingMode.HALF_UP); // result2 == 1.5 
BigDecimal result3 = bd.setScale(0, RoundingMode.HALF_UP); // result3 == 1 
+0

從那個圓的風格1.4444444445將四捨五入到2,這就是我們要的不是什麼。 – Hafthor

回答

3

這不是四捨五入的方式。 HALF_UP意味着如果一個數字恰好在兩個最接近的可用值(取決於比例)之間的中間,它將被四捨五入。其他任何東西都舍入到最接近的值。

the javadoc

提取物:

舍入模式走向「近鄰」,除非兩個相鄰數字的距離相等

要得到你所需要的行爲,你可以先後圓雖然我不知道爲什麼希望發生這樣的行爲:

BigDecimal bd = new BigDecimal("1.499"); // I'd like to round it to 2 
BigDecimal result1 = bd.setScale(2, RoundingMode.HALF_UP); // result1 == 1.50 
BigDecimal result2 = result1.setScale(0, RoundingMode.HALF_UP); // result2 == 2 
+0

Assylias,你是對的。但我需要整理歐元貨幣價值。規則說1.499應該四捨五入到1.50。然後,如果我想將其整數爲整數,我應該得到2. –

+0

@AndreaBorgogelliAvveduti好的 - 那麼我給的例子應該做你需要的。或者更確切地說,您應該將所有貨幣金額累計至小數點後兩位,這就是您的「官方」價值。然後你使用這個值並做你想要的或需要的,包括將它舍入到小數點後0位,如果你願意的話。 – assylias

+0

是的,非常好的建議 –

0

這個結果正是你應該得到的;舍入每個中間值犧牲精度,所以它直接舍入到正確的數字位數。

如果你真的想對方的行爲,你必須做一些像

while(number.scale() > 0) { 
    number.setScale(number.scale() - 1, RoundingMode.HALF_UP); 
} 
+0

路易絲,再次想到你是對的,先前的代碼做了什麼應該做的。但我需要整理歐元貨幣價值。規則說1.499應該四捨五入到1.50。然後,如果我想將其整數爲整數,我應該得到2. –

+0

Louise,謝謝你的建議 –