2015-04-18 75 views
2

我想圓的BigDecimal編號,以10向上或向下:Java中的BigDecimal:如何舍入到10?

112 - > 110

117 - > 120

150 - > 150

115 - > 120

114.9 - > 110

67 - > 70

64 - > 60

我嘗試這樣做:

number = number.round(new MathContext(1, RoundingMode.HALF_UP));

11 - > 10

150 - > 200 //錯誤!應該是150!

48 - > 50

500 - > 500

250 - > 300 //錯!應該是250!

240 - > 200 //錯!應該是240!

245 - > 200 //錯!應該是250!

51 - > 50

我已經嘗試了精密其他幾個值,但我從來沒有得到正確的舍入的所有值。

我在這裏失蹤了什麼?

回答

3

您錯過了MathContext對象與您正在執行舍入指定精度的舍入結果(==有效數字數),而不是規模(與最低有效位數的地點價值有關)。更一般地說,BigDecimal.round()是關於管理你的數字的精度,這不是你所追求的。

通過設置其比例,您可以將BigDecimal四捨五入爲任意給定功率的10的最接近倍數。舍入到10本身最接近的倍數,這將是:

number = number.setScale(-1, RoundingMode.HALF_UP)); 

注意,如果初始規模小於-1,則這將導致一個增加數的精度(通過加入顯着的尾隨零)。如果您不想要,那麼測試比例(BigSecimal.scale())以確定是否輪轉。

+0

很好的解釋。 'BigDecimal.round()'是誤導性的。 Tx – mrd

0

這是很容易用普通int做:

Math.round(個/ 10F)* 10

假設number是42,number/10f是4.2,其舍入到4.0,其中,當乘以10給40. 40.

+1

但是當我得到的是一個BigDecimal,這不是幫助我。 – mrd

2

您可以使用此:

private BigDecimal round(BigDecimal value) { 
    value = value.multiply(new BigDecimal(0.01)); 
    value = value.setScale(1, BigDecimal.ROUND_HALF_UP); 
    value = value.multiply(new BigDecimal(100)); 
    return value; 
} 

但執行規模正確的方法是:

value = value.setScale(-1, RoundingMode.HALF_UP); 

在這裏,您將有數量的指數表示。 您可以使用此方法:

value.toPlainString(); 

找回普通字符串。

toPlainString()返回字符串 沒有指數字段的此BigDecimal的表示形式。

+1

好吧,但是做前後乘法是很浪費的。它只是改變傳遞給'setScale()'的適當比例。 –

+0

是的,如果比例小於零,那麼默認的'String'表示使用指數表示法。這是避免顯示非重要數字的唯一方法,因爲在這種情況下單位數字不重要。根據舍入的目的,可以通過將結果的比例設置爲0來提高精度。 –