2017-07-21 4 views
-3

J'essaie de créer une calculatrice fiscale à plusieurs niveaux.Comment déterminer le taux d'imposition à plusieurs niveaux avec un extrait concis?

L'utilisateur saisit une quantité, soit 500,000

De ce montant, je puis les niveaux suivants taxe est facturée comme suit:

 0 - 125,000 = 0% 
    125,001 - 250,000 = 2% 
    250,001 - 925,000 = 5% 
    925,001 - 1,500,000 = 10% 
1,500,001 - or more = 12% 

donc pas d'impôt sur la première 125,000, puis 2% sur le prochain 124,999 et ainsi de suite.

Je peux arriver à des calculs longs avec beaucoup trop de lignes de code. Je suis sûr qu'il y a une façon relativement simple de le faire, donc je me plie à la plus grande connaissance des gens ici pour trouver une méthode plus concise.

+0

Je suis intéressé pour voir si je peux trouver quelque chose de plus concis, mais besoin d'avoir quelque chose à comparer! –

+0

Quel est le résultat attendu lorsque l'utilisateur entre 130 000? Je m'attendrais '125,000 * 0,00 + (130,000 - 125,000) * .02 = 100'. – Arjan

Répondre

1

Hm, beau défi cependant. Je suis désolé, je ne pourrais pas vraiment trouver une façon intelligente, mais si vous êtes dans le besoin, j'ai créé cette petite fonction; Vous juste le nourrir avec une valeur (int ou double) et il renverra la valeur calculée.

function calculator($value) { 

    if(!is_int($value) && !is_double($value)) 
     return; 

    if($value > 1500000) 
     $value = $value - ($value*0.12); 

    elseif($value > 925000) 
     $value = $value - ($value*0.10); 

    elseif($value > 250000) 
     $value = $value - ($value*0.05); 

    elseif($value > 125000) 
     $value = $value - ($value*0.02); 

    return $value; 

} 
Sachez cependant que vous ne pouvez pas utiliser , (virgule).

Édition: Modification de la logique un peu.

1

Cela ne fera aucune validation de nombre ou mise en forme de devise, mais il condensera assez bien l'extrait. Je ne suis pas sûr non plus quel chiffre vous vouliez, donc je vous renvoie trois valeurs: le taux, le montant de la taxe et le prix moins la taxe.

Plutôt qu'un bloc d'instructions if/else, j'ai choisi d'utiliser les fonctions de tableau. (Demo)

Méthode n ° 1: 2 lignes et un retour

function tax($value) { 
    $tiers=['.12'=>1500000,'.1'=>925000,'.05'=>250000,'.02'=>125000,'0'=>0]; 
    $rate=key(array_filter($tiers,function($threshold)use($value){return $value>$threshold;})); 
    return [$rate,$value*$rate,$value-$value*$rate]; 
} 

Méthode n ° 2: 4 lignes et un retour, mais plus efficace

function tax($value) { 
    $tiers=['.12'=>1500000,'.1'=>925000,'.05'=>250000,'.02'=>125000,'0'=>0]; 
    foreach($tiers as $rate=>$threshold){ 
     if($value>$threshold){break;} // $rate will be preserved outside of the loop 
    } 
    return [$rate,$value*$rate,$value-$value*$rate]; 
} 

L'appel de la fonction comme ceci : var_export(tax(126999)); affichera:

array (
    0 => '.12', 
    1 => 1523988.0, 
    2 => 11175912.0, 
) 

Puisque vous placez la «brièveté de code» devant «l'efficacité de code», je recommanderais la méthode # 1. Parce que cette tâche est si petite/légère, je pense que personne ne remarquera de gains grâce à la micro-optimisation.

p.s. Si vous ne faites pas cela plusieurs fois dans le même script et/ou ne voulez pas un appel de fonction, vous pouvez déclarer $rate en utilisant simplement ceci:

$tiers=['.12'=>1500000,'.1'=>925000,'.05'=>250000,'.02'=>125000,'0'=>0]; 
$rate=key(array_filter($tiers,function($threshold)use($value){return $value>$threshold;})); 

ou

$tiers=['.12'=>1500000,'.1'=>925000,'.05'=>250000,'.02'=>125000,'0'=>0]; 
foreach($tiers as $rate=>$threshold){ 
    if($value>$threshold){break;} 
}