Расчет доли дохода на разных уровнях
Вопрос
Я пытаюсь написать функцию, которая может рассчитывать доход на разных уровнях ... Например, вы продаете виджеты стоимостью 10000 долларов. Любой доход от 1 до 999 долларов мы берем 50%, от 1000 до 4999 долларов мы берем 25%, от 5000 до 9999 долларов мы берем 10%, от 10000 до 19999 долларов 5%. Р>
Процент не берется на основе окончательного значения. Так что, если вы заработали 10000 долларов, вы не просто попадете в колонку 10%. Ваши первые 1000 долларов подлежат 50%, следующие 5000 долларов 25%, следующие 4000 долларов 10%.
Заранее спасибо.
** Окончательный рабочий код. Спасибо за помощь!
$input = 10000;
$tiers = array('1000' => .5, '5000' => .25, '10000' => .1, '20000' => .05, '22000' => .01);
$accounted_for = 0;
$total_share = 0;
$tier = each($tiers);
while($accounted_for < $input) {
$cutoff = $tier[0];
$percent = $tier[1];
$level = (min($cutoff, $input) - $accounted_for) * $percent;
$total_share += $level;
$accounted_for = $cutoff;
$tier = each($tiers);
}
return $total_share;
Решение
Поскольку вы не указали язык, вот несколько псевдокодов:
input = 99999
tiers = [list of (%,cutoff) tuples]
accounted_for = 0
total_share = 0
while accounted_for is less than input:
percent,cutoff = next element of tiers
total_share += (min(cutoff,input) - accounted_for) * percent
accounted_for = cutoff
return total_share
Другие советы
Что вы делаете, так это то, как работает налоговый кодекс IRS, за исключением того, что IRS получает больше, чем больше вы зарабатываете. В этой модели комиссия снижается, чем больше вы продаете. Я предполагаю, что вы хотите получить ответ в PHP, поскольку вы поместили его в категорию PHP. Если вы хотите иметь разные расписания для разных продавцов, вы можете сделать массив уровней аргументом функции.
function calculateEarnings($grossAmountSold) {
$earnings = 0;
$accountedFor = 0;
$tiers = array('1000' => .5, '5000' => .25, '10000' => .1, '20000' => .05, '22000' => .01);
while($accountedFor < $grossAmountSold) {
list($cutoff, $commissionRate) = each($tiers);
if($grossAmountSold < $cutoff) {
$sold = $grossAmountSold - $accountedFor;
} else {
$sold = $cutoff - $accountedFor;
}
$earnings += $sold * $commissionRate;
$accountedFor += $cutoff;
}
return $earnings;
}