2017-07-21 64 views
-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等。

我可以拿出太多太多的代碼來計算冗長的計算。我確信有一個相對簡單的方法可以做到這一點,所以我鞠躬向這裏的人們提供更多的知識,以找到更簡潔的方法。

+0

我感興趣看看我能不能拿出更簡潔的東西,但需要有一些東西來比較它! –

+0

用戶輸入130,000時的預期結果是什麼?我期望'125,000 * 0.00 +(130,000 - 125,000)* .02 = 100'。 – Arjan

回答

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),它會返回計算值。請注意,您不能使用,(逗號)。

編輯:改變了一點邏輯。

1

這不會執行任何數字驗證或貨幣格式設置,但它確實可以很好地壓縮代碼段。我也不確定你想要哪一個數字,所以我返回三個數值:稅率,稅額和價格減稅。

而不是一個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;} 
}