Сумма распределения по нескольким переменным - PullRequest
0 голосов
/ 05 мая 2020

Интересно, есть ли элегантный способ сделать это с помощью одной функции вместо написания чего-то особенного.

Например, я хочу разделить 100 $ на 3 части (которые НЕ должны быть равными).

Если я просто сделаю 100/3, то каждая часть будет 33,33 $.

1 => 33.33
2 => 33.33
3 => 33.33

Если я объединю эти части вместе, он вернет 99,9 вместо 100.

Как я могу разделить значение на 3 части, одна из которых будет другой, поэтому когда вместе они будут равны 100 $, а не 99,9 $

1 => 33.34
2 => 33.33
3 => 33.33

Я написал эту функцию, но надеюсь, что есть один лайнер, который я могу использовать вместо него

function adjust_parts($total, $parts) {

    // If total does not equal the sum of all the parts
    if(array_sum($parts) != $total) {

        // Keep adding a penny until it's "properly" spread
        $adjusted = false;
        while ($adjusted == false) {
            $parts[0] += 0.01;
            if(bccomp(array_sum($parts), $total, 2) == 0) {
                $adjusted = true;
            }
        }

    }

    return $parts;

}

Спасибо

1 Ответ

2 голосов
/ 05 мая 2020

Вы можете составить массив $parts из $pieces-1 копий $total/$pieces, округленных до соответствующей точности, а затем просто pu sh конечное значение, которое равно $total минус сумма существующих частей. . Например:

$total = 100;
$pieces = 3;
$precision = 2;
$parts = array_fill(0, $pieces - 1, round($total / $pieces, $precision));
$parts[] = number_format($total - array_sum($parts), $precision);
print_r($parts);

Вывод

Array
(
    [0] => 33.33
    [1] => 33.33
    [2] => 33.34
)

Демо на 3v4l.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...