Java BigDecimal - округление до нескольких пользователей

88
7

У меня есть бизнес-требование, где входные значения должны округляться до кратных, предоставляемых пользователем. Вот пример:

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) я смог ограничить число десятичных точек.

спросил(а) 2021-01-25T13:48:32+03:00 4 месяца, 3 недели назад
1
Решение
89

Упрощенным решением может быть (псевдокод)

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

Вы должны позаботиться об округлении после того, как вы вычтите 0.1.

edit: возможное решение

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

ответил(а) 2021-01-25T13:48:32+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема