Как максимально равномерно распределить число по массиву Java и JS?

Рейтинг: -1Ответов: 1Опубликовано: 06.04.2023

Подскажите алгоритм как можно распределить n сумму денег, на количество месяцев без округления.

Например, дана сумма 100, её нужно распределить на 12 месяцев. То есть на выходе нужен массив из 12 элементов.
Если просто поделить 100 на 12 то получим ~8,333333333333333 в каждом элементе, что при расчёте денежных сумм не приемлемо.
Нужно получить максимально равномерно распределённые числа до 2х знаков после запятой.
На js такую возможность даёт библиотека currency методом distribute. Он смещает остатки к началу массива.

Подскажите подобную реализацию на java или сам алгоритм на js

Ответы

▲ 0Принят

Решение работает в целых числах - value * factor. Слева сумма, которую распределяем, справа множитель для перевода рублей в копейки.

В цикле от суммы отнимаем округлённые части. Распределение получается максимально равномерным.

const distribute = (value, n) => {
    const factor = 100;
    let sum = value * factor;
    const distribution = [];
    for (let i = n; i > 0; --i) {
        const v = Math.round(sum / i);
        distribution.push(v / factor);
        sum -= v;
    }
    return distribution;
};

console.log(distribute(100, 12).join(' '));

Тоже самое на Java:

    public static double[] distribute(double value, int n) {
        final double factor = 100;
        double sum = value * factor;
        double[] distribution = new double[n];
        for (int i = 0; i < n; ++i) {
            double v = Math.round(sum / (n - i));
            distribution[i] = v / factor;
            sum -= v;
        }
        return distribution;
    }