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

Java中的BigDecimal:如何四舍五入到10?,java,rounding,bigdecimal,Java,Rounding,Bigdecimal,我想将BigDecimal数字向上或向下舍入为10: 112-->110 117-->120 150-->150 115-->120 114.9-->110 67-->70 64-->60 等等 我试过这个: number=number.round(新的MathContext(1,RoundingMode.HALF_UP)) 11->10 150->200//错了!应该是150 48->50 500->500 250->300//错了!应该是250 240->200//错了!应该是240 245

我想将BigDecimal数字向上或向下舍入为10:

112-->110

117-->120

150-->150

115-->120

114.9-->110

67-->70

64-->60

等等

我试过这个:

number=number.round(新的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

我尝试了其他几个精度值,但从未对所有值进行正确的舍入


我这里缺少什么?

使用普通的
int
很容易做到:

数学四舍五入(数字/10f)*10


假设
number
为42,
number/10f
为4.2,四舍五入为
4.0
,乘以10得到40。

您缺少执行四舍五入的
MathContext
对象指定四舍五入结果的精度(=有效位数),而不是小数位数(与最低有效位的位值相关)。更一般地说,
BigDecimal.round()
都是关于管理数字的精度,而这不是您所追求的

通过设置小数位数,您可以将
BigDecimal
四舍五入到任何给定的10次幂的最接近倍数。要将其四舍五入到10本身的最接近倍数,请执行以下操作:

number = number.setScale(-1, RoundingMode.HALF_UP));
请注意,如果初始刻度小于-1,则会导致数字精度增加(通过添加有效的尾随零)。如果您不希望这样,请测试刻度(
BigSecimal.scale()
)以确定是否舍入。

您可以使用以下方法:

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的表示形式


但是当我得到的是一个大的十进制数时,这对我没有帮助。好吧,但是做前后乘法是浪费的。它只是改变了传递到
setScale()的适当比例
。是的,如果刻度小于零,则默认的
字符串
表示法使用指数表示法。这是避免显示非有效数字的唯一方法,因为在这种情况下,单位数字不重要。根据舍入的目的,可能适合通过将刻度设置为0来提高精度f结果为0。很好的解释。
BigDecimal.round()
是误导性的。Tx