Java BigDecimal - 向下舍入到用户提供的倍数

Java BigDecimal - rounding down to the user-provided multiple

我有一个业务需求,其中输入值应向下舍入为用户提供的倍数。这是示例:

Case | input | multiples | output
1    | 43.0  | 0.1       | 43.0
2    | 43.1  | 0.1       | 43.1
3    | 43.2  | 0.1       | 43.2
4    | 43.0  | 0.2       | 43.0
5    | 43.1  | 0.2       | 43.0
6    | 43.2  | 0.2       | 43.2

如果multiples为0.1,则输出应以0.1为增量,例如43.1、43.2等。

如果 multiples 为 0.2,则输出应以 0.2 为增量,例如 43.0、43.2、43.4 等。

在 Java 中使用 BigDecimal 执行此操作的最佳方法是什么?不过,使用 BigDecimal.setScale(1, ROUND_DOWN) 我能够限制小数点的数量。

一个简化的解决方案可以是(伪代码)

if (multiple == 0.1) then {
    output = input
} else {
    if ((int) input * 10 % 2 == 1) {
        output -= 0.1
    } else {
        output = input
    }
}

减去0.1后需要注意四舍五入

编辑:可能的解决方案

double input = 43.0;
for (int i = 0; i <= 10; i++) {
    double output = input;
    if ((int) (input * 10) % 2 == 1) {
        output = ((double) (int) (input * 10) - 1) / 10;
    }
    System.out.printf("input:  %f   output: %f%n", input, output);
    input += 0.1;
}

结果输出

input:  43.000000   output: 43.000000
input:  43.100000   output: 43.000000
input:  43.200000   output: 43.200000
input:  43.300000   output: 43.200000
input:  43.400000   output: 43.400000
input:  43.500000   output: 43.400000
input:  43.600000   output: 43.600000
input:  43.700000   output: 43.600000
input:  43.800000   output: 43.800000
input:  43.900000   output: 43.800000
input:  44.000000   output: 44.000000