我想将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
我已经尝试了其他几个精度值,但我从来没有得到所有值的正确舍入。
我在这里缺少什么?
答案 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。