-3

我正在尝试创建一个分层税计算器。

用户输入一个金额,比如说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,依此类推。

我可以用太多的代码行来进行冗长的计算。我确信有一种相对简单的方法可以做到这一点,所以我向这里的人们的更多知识低头,以找到更简洁的方法。

4

2 回答 2

1

嗯,不错的挑战。对不起,我真的想不出一个聪明的方法,但如果你急需,我创建了这个小功能;

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),它将返回计算值。请注意,您不能使用,(逗号)。

编辑:稍微改变了逻辑。

于 2017-07-22T00:17:52.440 回答
1

这不会进行任何数字验证或货币格式化,但它确实很好地压缩了代码段。我也不确定您想要的结果是哪个数字,所以我返回三个值:税率、税额和减去税后的价格。

我选择使用数组函数而不是 if/else 语句块。(演示

方法 #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。因为这个任务非常小/轻,我认为没有人会注意到通过微优化获得的任何收益。

ps 如果您没有在同一个脚本中多次执行此操作和/或不想要函数调用,您可以$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;}
}
于 2017-07-22T03:13:38.537 回答