Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 大十进制除法、舍入和和_Java_Bigdecimal - Fatal编程技术网

Java 大十进制除法、舍入和和

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

我正在使用一个表示货币金额的大十进制值。我需要将此金额分成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的倍数(或任何其他整数)
  • 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));