Java中的BigDecimal:如何舍入到10?

时间:2015-04-18 18:44:52

标签: java rounding bigdecimal

我想将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 个答案:

答案 0 :(得分:4)

您缺少与您执行舍入的MathContext对象指定舍入结果的精度(==有效数字的数量),而不是比例(与最低有效数字的位置值)。更一般地说,BigDecimal.round()就是要管理你的数字的精确度,这不是你想要的。

您可以通过设置比例BigDecimal四舍五入到任意给定幂10的最接近倍数。要舍入到10的最接近的倍数,那将是:

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

请注意,如果初始比例小于-1,则会导致数字精度的增加(通过添加显着的尾随零)。如果您不想这样做,请测试比例(BigSecimal.scale())以确定是否要进行舍入。

答案 1 :(得分: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的表示。

答案 2 :(得分:0)

使用普通的int

非常容易

Math.round(个/ 10F)* 10

假设number为42,number/10f为4.2,其舍入为4.0,乘以10后为40。