2013-12-12 53 views
3

我需要使用的BigDecimal roundingmode.xxx和setScale(2)這些結果:的BigDecimal舍入模式問題

(5.789).setScale(2, RoundingMode.xxx) = 5.79 

(2.894).setScale(2, RoundingMode.xxx) = 2.89 

(2.895).setScale(2, RoundingMode.xxx) = 2.89 

凡RoundingMode.xxx 必須是相同的三個給定的值

我試過所有的組合但沒有成功,Microsoft Excel設置了三個成功的結果。

+1

http://docs.oracle.com/javase/7/docs/api/java/math/RoundingMode。html#HALF_DOWN – cHao

回答

0

問題是當我乘以兩個BigDecimal時,我得到了一個很大的結果。之後我用setScale(2, HalfDown)但沒有得到想要的結果。

錯誤的結果

"2.89500004313886165618896484375".setScale(2, BigDecimal.ROUND_HALF_DOWN); 

我需要2.89和錯誤的結果是2.90

使用.round(new MathContext(2))我懂了:

"2.89500004313886165618896484375".round(new MathContext(2)); 

正確的結果是2.89

1

您正在尋找RoundingMode.HALF_DOWN

舍入模式走向「近鄰」,除非雙方 的距離相等,在這種情況下,一輪下來。表現爲 RoundingMode.UP,如果丟棄的分數大於0.5;否則,與RoundingMode.DOWN一樣,其行爲爲 。

例子:

public static void main(String args []){ 

    System.out.println(new BigDecimal("5.789").setScale(2, RoundingMode.HALF_DOWN)); 
    System.out.println(new BigDecimal("2.894").setScale(2, RoundingMode.HALF_DOWN)); 
    System.out.println(new BigDecimal("2.895").setScale(2, RoundingMode.HALF_DOWN)); 

} 

輸出

5.79 
2.89 
2.89 
3

你可以使用ROUND_HALF_DOWN

入模式走向 「近鄰」 輪,除非雙方 的距離相等,在這種情況下,下降。如果廢棄部分大於0.5,則表現爲 ROUND_UP;否則,表現爲 ROUND_DOWN。

您的輸入:

static void roundTo(BigDecimal input) 
{ 
    BigDecimal output = input.setScale(2, BigDecimal.ROUND_HALF_DOWN); 
    System.out.println(input + " => " + output); 
} 

roundTo(new BigDecimal("5.789")); 
roundTo(new BigDecimal("2.894")); 
roundTo(new BigDecimal("2.895")); 

這將產生:

5.789 => 5.79 
2.894 => 2.89 
2.895 => 2.89 

編輯:根據您的意見,下面可能會爲你工作:

BigDecimal output = input.setScale(3, BigDecimal.ROUND_HALF_DOWN).setScale(2, BigDecimal.ROUND_HALF_DOWN); 
+0

我們有幾乎相同的答案xD – nachokk

+0

我不知道發生了什麼,但我沒有得到它與round_half_down。我的值爲:2.89500004313886165618896484375並且在使用setScale(....)後,結果爲2.90 – Al2x

+0

@Al2x(1)從上面的文檔鏈接可以看出,大於0.5的分數將被舍入。 (2)請在你的問題中包含正確的例子。 – devnull