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()
就是管理你的数字的精度,这不是你所追求的。
您可以通过设置 scale 将 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() Returns a string
representation of this BigDecimal without an exponent field.
我想将 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()
就是管理你的数字的精度,这不是你所追求的。
您可以通过设置 scale 将 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() Returns a string representation of this BigDecimal without an exponent field.