Java 大十进制除法、舍入和和
我正在使用一个表示货币金额的大十进制值。我需要将此金额分成6个利率,前5个利率四舍五入为5,第6个利率为其余利率Java 大十进制除法、舍入和和,java,bigdecimal,Java,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
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的倍数(或任何其他整数)
- 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)));
}
根据我对要求的理解,我将执行以下操作来计算
费率
:
BigDecimal rate = currencyAmount
.divide(new BigDecimal(numberOfRates * 5), RoundingMode.UP)
.setScale(0, RoundingMode.UP)
.multiply(new BigDecimal(5));
四舍五入模式不应该基于要求吗?事实上,要求不明确,一个地方说最多5,另一个地方说最接近5。这不会给出中间值的5倍。我误解了这个问题,但我的输出显示5和10是5的倍数??我理解为最接近5的倍数,我同意,这应该行得通。唯一的问题是,当要求做出两个不一致的陈述时,舍入应该是哪种方式。在本例中,您的预期结果是什么?根据所描述的内容,Adam下面的答案对您来说应该很好。我要说的唯一一件事是,要求您做出两个单独的声明(1)“前5个费率四舍五入到5”和(2)“四舍五入到5的最接近倍数(或任何其他整数)”。如果您的需求是第二个,那么它就是确切的答案;否则,如果您的需求实际上是第一个,那么您会将代码更改为RoundingMode.UP,而不是RoundingMode.HAFL_UP
BigDecimal rate = currencyAmount
.divide(new BigDecimal(numberOfRates * 5), RoundingMode.UP)
.setScale(0, RoundingMode.UP)
.multiply(new BigDecimal(5));