BigDecimal 除法、舍入和求和
BigDecimal division, rounding and sums
我正在使用代表货币金额的 BigDecimal 值。我需要将此金额分成 6 个费率,前 5 个费率四舍五入为 5,剩下的是第 6 个费率。
BigDecimal numberOfRates = new BigDecimal("6");
BigDecimal currencyAmount = new BigDecimal("650.30");
BigDecimal rate = currencyAmount.divide(numberOfRates);
rate = //rate rounded up to closest multiple of 5
BigDecimal lastRate = currencyAmount.subtract(rate.multiply(new BigDecimal("5"));
我的 2 个问题是:
- 如何舍入到最接近的 5 的倍数(或任何其他整数)?
- 这 6 个费率加起来是否总是给出原始货币金额,或者是否存在因除法而导致的精度问题?
(这是一个简化的例子,我确实意识到在这个设置下最后的汇率可能是负的。)
* 更新问题 *
示例的预期结果是:
- 费率 1-5:110.00
- 费率 6:100.30
在这种情况下:5*110.00 + 100.30 = 650.30
通过使用指定的方法,所有费率的总和是否总是等于初始金额?
使用除法、舍入、乘法的标准方法
private static BigDecimal round(BigDecimal input, int multiple) {
return input.divide(new BigDecimal(multiple))
.setScale(0, RoundingMode.CEILING)
.multiply(new BigDecimal(multiple));
}
for (double i = 0; i < 10; i += 0.9) {
System.out.println(String.format("%.1f => %s", i, round(new BigDecimal(i), 5)));
}
输出
0.0 => 0
0.9 => 5
1.8 => 5
2.7 => 5
3.6 => 5
4.5 => 5
5.4 => 10
6.3 => 10
7.2 => 10
8.1 => 10
9.0 => 10
9.9 => 10
根据我对要求的理解,我将执行以下计算 rate
:
BigDecimal rate = currencyAmount
.divide(new BigDecimal(numberOfRates * 5), RoundingMode.UP)
.setScale(0, RoundingMode.UP)
.multiply(new BigDecimal(5));
我正在使用代表货币金额的 BigDecimal 值。我需要将此金额分成 6 个费率,前 5 个费率四舍五入为 5,剩下的是第 6 个费率。
BigDecimal numberOfRates = new BigDecimal("6");
BigDecimal currencyAmount = new BigDecimal("650.30");
BigDecimal rate = currencyAmount.divide(numberOfRates);
rate = //rate rounded up to closest multiple of 5
BigDecimal lastRate = currencyAmount.subtract(rate.multiply(new BigDecimal("5"));
我的 2 个问题是:
- 如何舍入到最接近的 5 的倍数(或任何其他整数)?
- 这 6 个费率加起来是否总是给出原始货币金额,或者是否存在因除法而导致的精度问题?
(这是一个简化的例子,我确实意识到在这个设置下最后的汇率可能是负的。)
* 更新问题 *
示例的预期结果是:
- 费率 1-5:110.00
- 费率 6:100.30 在这种情况下:5*110.00 + 100.30 = 650.30
通过使用指定的方法,所有费率的总和是否总是等于初始金额?
使用除法、舍入、乘法的标准方法
private static BigDecimal round(BigDecimal input, int multiple) {
return input.divide(new BigDecimal(multiple))
.setScale(0, RoundingMode.CEILING)
.multiply(new BigDecimal(multiple));
}
for (double i = 0; i < 10; i += 0.9) {
System.out.println(String.format("%.1f => %s", i, round(new BigDecimal(i), 5)));
}
输出
0.0 => 0
0.9 => 5
1.8 => 5
2.7 => 5
3.6 => 5
4.5 => 5
5.4 => 10
6.3 => 10
7.2 => 10
8.1 => 10
9.0 => 10
9.9 => 10
根据我对要求的理解,我将执行以下计算 rate
:
BigDecimal rate = currencyAmount
.divide(new BigDecimal(numberOfRates * 5), RoundingMode.UP)
.setScale(0, RoundingMode.UP)
.multiply(new BigDecimal(5));