BigDecimal分割,舍入和求和

时间:2015-02-11 20:22:12

标签: java bigdecimal

我正在处理代表货币金额的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"));

我的两个问题是:

  • 如何舍入到5(或任何其他int)的最接近的倍数?
  • 总结的6个费率总是会给出原始货币安装吗?或者由于分割而存在精确度问题吗?

(这是一个简化的例子,我确实意识到这个设置的最后一个速率可能是负的。)

*更新问题*

示例的预期结果是:

  • 费率1-5:110.00
  • 费率6:100.30 在这种情况下:5 * 110.00 + 100.30 = 650.30

通过使用指示的方法,所有费率的总和是否等于初始数量?

2 个答案:

答案 0 :(得分:2)

使用划分,舍入,乘法的标准方法

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

答案 1 :(得分:0)

根据我对要求的理解,我会在计算rate

时执行以下操作
BigDecimal rate = currencyAmount
            .divide(new BigDecimal(numberOfRates * 5), RoundingMode.UP)
            .setScale(0, RoundingMode.UP) 
            .multiply(new BigDecimal(5));