Получите 921 и 999 на 39 петель как целые числа - PullRequest
0 голосов
/ 03 января 2019

Я нахожусь в ситуации, когда мне нужно достичь деления 921/39 и, задав целые числа (39 раз для цикла), снова достичь 921.

$packagesCount = count($packages);      // = 39
$averageWeight = 921/$packagesCount;    // = 23.6153846154

foreach ($packages as $package) {
    $package['Weight'] = "<whole number>";
}

Причина в том, что мне нужно дать целые числа API, но общее число должно быть 921. Таким образом, я не могу дать круглые числа.


Один из способов, о котором я подумал:

$packagesCount = count($packages);      // = 39
$averageWeight = 921/$packagesCount;    // = 23.6153846154
$remainder = ceil($averageWeight);      // = 24 

foreach ($packages as $package) {
    $package['Weight'] = floor($averageWeight);

    if ($remainder > 0) {
        $package['Weight'] += 1;            
        $remainder -= 1;
    }
}

Но попытка с общим весом 999 не работает с этим подходом; вместо 999 в конце он дает 39 * 25 + 26 = 1001.

Для 999 я должен использовать 39 * 25 + 24 = 999 но как?

1 Ответ

0 голосов
/ 04 января 2019

Я думаю, вам нужно intdiv и по модулю %:

$packagesCount = count($packages);     
$averageWeight = $totalWeight/$packagesCount;
$wholeWeight = intdiv($totalWeight,$packagesCount);
$weightRest = $totalWeight % $packagesCount;
// totalWeight = wholeWeight * packagesCount + weightRest 

$i = 0;
foreach ($packages as $key => $package) {
    $w = $wholeWeight;
    if ($i < $weightRest) {
     $w += 1;
    }
    $i+= 1;
    $packages[$key]['Weight'] = $w;
}

Идея состоит в том, что каждая упаковка будет иметь вес не менее intdiv, а первая упаковка weightRest будет иметь +1 к своему весу. Таким образом, вы будете точно соответствовать вашему totalWeight.

См. Также онлайн-демонстрацию

P.S. PHP не мой язык, поэтому код может быть очень не идиоматическим. Тем не менее, я надеюсь, что это передает идею.

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