2016-07-29 136 views
-1

我有所得税C#所得税计算器

20% 
40% 
45% 

所以不同的速率3个文本框之间

£11,000 - £43,000 20% 
£43,001 - £150,000 40% 
150,000+   45% 

所以计算£11000£43000之间我写了如果税收声明

if(Salary > decimal.Parse(noTaxThreshold) && Salary <= decimal.Parse(pc20TaxLimit)) 
      { 
       taxableIncome = Salary - decimal.Parse(noTaxThreshold); 
       annualTax = taxableIncome * decimal.Parse(lowerTaxPc); 
       tbATax.Text = annualTax.ToString(); 
      } 
      else 
      { 
       tbANetPay.Text = tbAGrossPay.Text; 
       tbATax.Text = "0.00"; 
      } 

我该如何去弄清楚其他金额,例如,如果工资是200,000英镑pe r年,那么这将有3个不同的所得税率。

+1

为什么你必须解析你的noTaxThreshold变量?它不是小数? – LarsTech

+1

只是一个简单的if-then-else .... – 2016-07-29 14:14:51

+0

我做了一个SqlCommand从另一个SQL表中获取税务信息,然后将值存储在变量中,但无法让它工作,除非我使用了字符串,所以我不得不解析。目前的门槛是11,000.00英镑,所以我认为小数比双倍会更好。 –

回答

0

您可能会发现更容易向后工作和折扣你已经在计算税额时总是将其更改为小数。如何:

public decimal CalculateTax(decimal salary) { 
    const int topRateThreshold = 150000; 
    const int higherRateThreshold = 43000; 
    const int basicRateThreshold = 11000; 

    const decimal topRateFactor = 0.45M; 
    const decimal higherRateFactor = 0.40M; 
    const decimal basicRateFactor = 0.20M; 

    decimal salaryWorkingRange = salary; 

    decimal taxDue = 0; 

    if (salaryWorkingRange > topRateThreshold) { 
     taxDue += (salaryWorkingRange - topRateThreshold) * topRateFactor; 
     salaryWorkingRange = topRateThreshold; 
    } 
    if (salaryWorkingRange > higherRateThreshold) { 
     taxDue += (salaryWorkingRange - higherRateThreshold) * higherRateFactor; 
     salaryWorkingRange = higherRateThreshold; 
    } 
    if (salaryWorkingRange > basicRateThreshold) { 
     taxDue += (salaryWorkingRange - basicRateThreshold) * basicRateFactor; 
    } 

    return taxDue; 
} 
0

这听起来像你想在一定数额的统一税率。如果是这样那么这应该这样做:

private decimal CalculateTax(int salary) 
    { 
     int noTaxThreshold = 11000; 
     int band1 = 10999; 
     int band2 = 43000; 
     int band3 = 150000; 

     if (salary < noTaxThreshold) return 0; 
     if (salary >= band3) return (salary - noTaxThreshold) * (decimal)0.45; 
     if (salary > band2) return (salary - noTaxThreshold) * (decimal)0.40; 
     if (salary > band1) return (salary - noTaxThreshold) * (decimal)0.20; 
     return 0; 
    } 

通常是通过你在带征税,因此您只需支付45%的税的部分,你earnt这是超过 150K

我用一个int为作为通常你得到征税圆形量的薪水,你可以,如果你需要

0

我实际上已经接近这一点更加动态。

public class TaxBracket 
{ 
    public int Low { get; set; } 
    public int High { get; set; } 
    public decimal Rate { get; set; } 
} 

public class TaxCalculator 
{ 
    private readonly int _taxableIncome; 
    private readonly TaxBracket[] _taxBrackets; 

    public TaxCalculator(int taxableIncome, TaxBracket[] taxBrackets) 
    { 
     _taxableIncome = taxableIncome; 
     _taxBrackets = taxBrackets; 
    } 

    public decimal Calculate() 
    { 
     var fullPayTax = 
      _taxBrackets.Where(t => t.High < _taxableIncome) 
       .Select(t => t) 
       .ToArray() 
       .Sum(taxBracket => (taxBracket.High - taxBracket.Low)*taxBracket.Rate); 

     var partialTax = 
      _taxBrackets.Where(t => t.Low <= _taxableIncome && t.High >= _taxableIncome) 
       .Select(t => (_taxableIncome - t.Low)*t.Rate) 
       .Single(); 

     return fullPayTax + partialTax; 
    } 
} 

由于我们传入括号,它使得任何更改都更容易。

0

不要把你的代码加载到ifs中。如果创建新的税区会怎样?试试这个方法:

var taxBands = new[] 
{ 
    new { Lower = 0m, Upper = 10999m, Rate = 0.0m }, 
    new { Lower = 11000m, Upper = 43000m, Rate = 0.2m }, 
    new { Lower = 43001m, Upper = 150000m, Rate = 0.4m }, 
    new { Lower = 150001m, Upper = decimal.MaxValue, Rate = 0.45m } 
}; 

var salary = 200000m; // however you get the salary figure 

var taxToBePaid = 0m; 

foreach (var band in taxBands) 
{ 
    if(salary > band.Lower) 
    { 
     var taxableAtThisRate = Math.Min(band.Upper - band.Lower, salary - band.Lower); 
     var taxThisBand = taxableAtThisRate * band.Rate; 
     taxToBePaid += taxThisBand; 
    } 
} 

Console.WriteLine(taxToBePaid); // or do whatever you want here