如何用简明的代码确定分层税率?
问题描述:
我正在尝试创建一个分层计税器。如何用简明的代码确定分层税率?
用户输入的金额,说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
等。
我可以拿出太多太多的代码来计算冗长的计算。我确信有一个相对简单的方法可以做到这一点,所以我鞠躬向这里的人们提供更多的知识,以找到更简洁的方法。
答
嗯,不错的挑战。我很抱歉,我无法真正想出一个聪明的方式,但如果你急需我创建这个小功能;
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;}
}
我感兴趣看看我能不能拿出更简洁的东西,但需要有一些东西来比较它! –
用户输入130,000时的预期结果是什么?我期望'125,000 * 0.00 +(130,000 - 125,000)* .02 = 100'。 – Arjan