如何用简明的代码确定分层税率?

问题描述:

我正在尝试创建一个分层计税器。如何用简明的代码确定分层税率?

用户输入的金额,说500,000

从这个量,那么我有税是下列各级如下:

 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% 

所以第一125,000没有税收,然后2%在下一个124,999等。

我可以拿出太多太多的代码来计算冗长的计算。我确信有一个相对简单的方法可以做到这一点,所以我鞠躬向这里的人们提供更多的知识,以找到更简洁的方法。

+0

我感兴趣看看我能不能拿出更简洁的东西,但需要有一些东西来比较它! –

+0

用户输入130,000时的预期结果是什么?我期望'125,000 * 0.00 +(130,000 - 125,000)* .02 = 100'。 – Arjan

嗯,不错的挑战。我很抱歉,我无法真正想出一个聪明的方式,但如果你急需我创建这个小功能;

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; 

} 

你只是给它提供一个值(int或double),它会返回计算值。请注意,您不能使用,(逗号)。

编辑:改变了一点逻辑。

这不会执行任何数字验证或货币格式设置,但它确实可以很好地压缩代码段。我也不确定你想要哪一个数字,所以我返回三个数值:税率,税额和价格减税。

而不是一个if/else语句块,我选择使用数组函数。 (Demo

方法#1:2线和一返回

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]; 
} 

方法#2:4-线和返回,但更有效

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]; 
} 

调用这样的功能:var_export(tax(126999));将输出:

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

由于您在“代码效率”之前放置了“代码简洁性”,因此我会推荐方法1。由于这项任务太小或太轻,我认为任何人都不会注意到通过微观优化获得的收益。

p.s.如果你不这样做,多次在同一个脚本和/或不希望一个函数调用,你可以使用此声明$rate

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

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