Использование BigDecimal
без каких-либо двойных чисел (улучшен ответ от marcolopes):
public static BigDecimal round(BigDecimal value, BigDecimal increment,
RoundingMode roundingMode) {
if (increment.signum() == 0) {
// 0 increment does not make much sense, but prevent division by 0
return value;
} else {
BigDecimal divided = value.divide(increment, 0, roundingMode);
BigDecimal result = divided.multiply(increment);
return result;
}
}
Режим округления, например, RoundingMode.HALF_UP
. Для ваших примеров вы действительно хотите RoundingMode.UP
(bd
- это помощник, который просто возвращает new BigDecimal(input)
):
assertEquals(bd("1.05"), round(bd("1.03"), bd("0.05"), RoundingMode.UP));
assertEquals(bd("1.10"), round(bd("1.051"), bd("0.05"), RoundingMode.UP));
assertEquals(bd("1.05"), round(bd("1.05"), bd("0.05"), RoundingMode.UP));
assertEquals(bd("1.95"), round(bd("1.900001"), bd("0.05"), RoundingMode.UP));
Также обратите внимание, что в вашем последнем примере есть ошибка (округление 1.900001 до 1.10).