2015-04-18 109 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来提高精度。 –