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

BigDecimal in Java: How to round to 10?

我想将 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

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

我在这里缺少什么?

用普通的int:

很容易做到

Math.round(number/10f)*10

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

您遗漏了用于执行舍入的 MathContext 对象指定了舍入结果的 精度(== 有效数字位数),而不是比例尺(与最低有效位的位值有关)。更一般地说,BigDecimal.round() 就是管理你的数字的精度,这不是你所追求的。

您可以通过设置 scaleBigDecimal 舍入到任何给定的 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() Returns a string representation of this BigDecimal without an exponent field.