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

mrd*_*mrd 3 java rounding bigdecimal

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

\n\n

112 --> 110

\n\n

117 --> 120

\n\n

150 --> 150

\n\n

115 --> 120

\n\n

114.9 --> 110

\n\n

67 --> 70

\n\n

64 --> 60

\n\n

ETC。

\n\n

我试过这个:

\n\n

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

\n\n

11 \xe2\x80\x94> 10

\n\n

150 \xe2\x80\x94> 200 // 错误!应该是150!

\n\n

48 \xe2\x80\x94> 50

\n\n

500 \xe2\x80\x94> 500

\n\n

250 \xe2\x80\x94> 300 // 错误!应该是250!

\n\n

240 \xe2\x80\x94> 200 // 错误!应该是240!

\n\n

245 \xe2\x80\x94> 200 // 错误!应该是250!

\n\n

51 -> 50

\n\n

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

\n\n

我在这里缺少什么?

\n

Joh*_*ger 5

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

您可以BigDecimal通过设置 a 的小数位数将 a 舍入到任何给定 10 次幂的最接近的倍数。要四舍五入到最接近的 10 本身的倍数,则为:

number = number.setScale(-1, RoundingMode.HALF_UP));
Run Code Online (Sandbox Code Playgroud)

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