Pergunta

Eu estou tentando escrever uma função que pode calcular a receita em diferentes níveis hierárquicos ... Por exemplo, você vender US $ 10000 no valor de widgets. Quaisquer ganhos de $ 1 - $ 999 levamos 50%, $ 1000 - $ 4999 levamos 25%, $ 5000 - $ 9999 levamos 10%, $ 10000 - $ 19999 de 5%.

A porcentagem não é tomada com base no valor final. Então, se você ganhou US $ 10000 você não apenas cair na coluna 10%. O seu primeiro US $ 1000 está sujeito a 50%, o próximo $ 5000 25%, o próximo $ 4000 10%.

Agradecemos antecipadamente.

** código de trabalho final. Obrigado pela ajuda!

    $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;
Foi útil?

Solução

Uma vez que você não tenha especificado um idioma, aqui está um pseudocódigo:

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

Outras dicas

O que você está fazendo é como o código de imposto do IRS funciona, exceto o IRS recebe mais quanto mais você faz. Neste modelo os comissão desliza para baixo quanto mais você vende. Eu estou supondo que você quer a resposta em PHP desde que você colocá-lo na categoria PHP. Se você queria ter horários diferentes para pessoas diferentes de vendas que você poderia fazer a matriz tiers um argumento para a função.

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top