✏️ 1.3.7 个税计算器¶
本节我们以简化后的个人所得税计算为例,巩固switch表达式的用法。
背景:累计预扣法¶

在我们的收入(大方框)里,有一部分钱是不需要纳税的(方框左边的部分)。收入减去这部分不需要纳税的钱,剩下的部分叫做 应纳税所得额 (方框右边的部分)。
从应纳税所得额里面,按比例抽取一部分钱上交国家用于公共事业,这部分钱就叫做应纳个人所得税额,简称 应纳税额 (红色椭圆)。
收入减掉应纳税额,剩下的钱叫 税后收入 (浅绿色+深绿色部分)。
个人所得税以月为单位进行计算。一年有12个月。从1月到本月的某项金额累加起来就叫累计XX。
假设现在是4月,那么把1月、2月、3月、4月的收入加起来就叫4月的累计收入。累计收入里扣除不需要纳税的部分就是累计应纳税所得额。累计应纳所得税额按一定的比例抽取出来的税金就叫累计应纳税额。嗯,基本上把前面的话重复了一遍。
比较麻烦的一点是,税率不是固定的。考虑到社会公平,会对收入比较高的群体多征收一些税,对收入比较低的群体少征收一些税。把累计应纳税所得额划分为7档,也就是7个区间:
| 级数 | 累计应纳税所得额 | 税率(%) | 速算扣除数 |
|---|---|---|---|
| 1 | 不超过36000元的部分 | 3 | 0 |
| 2 | 超过36000元至144000元的部分 | 10 | 2520 |
| 3 | 超过144000元至300000元的部分 | 20 | 16920 |
| 4 | 超过300000元至420000元的部分 | 25 | 31920 |
| 5 | 超过420000元至660000元的部分 | 30 | 52920 |
| 6 | 超过660000元至960000元的部分 | 35 | 85920 |
| 7 | 超过960000元的部分 | 45 | 181920 |
对落入不同区间的部分按照不同的税率进行征收。假设某月的累计应纳税所得额是200000元,查阅上表,我们可以知道,200000元横跨前3级。
现在,让这200000元排队站好,
- 前36000元出列,按3%比例征收:36000 × 3% = 1080(元)
- 第36001元~第144000元出列,按10%比例征收:(144000 - 36000) × 10% = 10800(元)
- 第144001元~第200000元出列,按20%比例征收:(200000 - 144000) × 20% = 11200(元)
因此,累计应纳税额为1080 + 10800 + 11200 = 23080(元)。
这种按照区间拆开来计算的方法真的很麻烦!我们换一个思路来看。我们不拆分了,让这200000元全体都按照最高那档,也就是20%的比例进行征收,这样子的话,第1级的部分就多收了20 - 3 = 17(%)的税,第2级的部分多收了20 - 10 - 10(%)的税。
这部分多收的钱当然要被减掉。对第1级,多收了:36000 × 17% = 6120(元);对第2级,多收了:(144000 - 36000) × 10% = 10800(元)。合计6120 + 10800 = 16920(元)。实际应缴纳200000 × 20% - 16920 = 23080(元)。
因此,现在只需要先全体按照最高的那档税率计算,再把多算进来的钱减去。对于每一级,多算的钱都是固定的,这部分钱叫 速算扣除数 ,你可以在上面的表格中直接查阅到。
公式
累计应纳税额 = 累计应纳税所得额 × 税率 - 速算扣除数
实现个税计算器¶
已知累计收入和累计扣除额,采用累计预扣法计算累计税后收入。
首先,声明这几个变量。因为涉及到钱,我们需要使用高精度的十进制浮点数类型。
有了这两个量,我们就可以计算累计应纳税所得额了:
接下来,税率和速算扣除数都是会根据累计应纳税所得额的大小发生变化的量,我们可以用switch表达式来处理这种变化,计算出正确的累计应纳税额。
用关系模式和逻辑模式,在switch表达式的分支中清晰地界定各个等级的范围:
decimal accumulatedTax = taxableIncome switch
{
>= 0 and <= 36000m => taxableIncome * 0.03m - 0m,
> 36000m and <= 144000m => taxableIncome * 0.10m - 2520m,
> 144000m and <= 300000m => taxableIncome * 0.20m - 16920m,
> 300000m and <= 420000m => taxableIncome * 0.25m - 31920m,
> 420000m and <= 660000m => taxableIncome * 0.30m - 52920m,
> 660000m and <= 960000m => taxableIncome * 0.35m - 85920m,
> 960000m => taxableIncome * 0.45m - 181920m,
_ => 0,
};
最后,用了一个默认分支匹配那些异常的数额(比如小于0的累计应纳税所得额)。
用累计收入减去累计应纳税额,就得到了我们想要的结果——累计税后收入。
decimal accumulatedIncomeAfterTax = accumulatedIncome - accumulatedTax;
Console.Write("累计税后收入:");
Console.Write(accumulatedIncomeAfterTax);
Console.WriteLine("元。");
完整代码如下:
decimal accumulatedIncome;
decimal accumulatedDeduction;
decimal taxableIncome = accumulatedIncome - accumulatedDeduction;
decimal accumulatedTax = taxableIncome switch
{
>= 0 and <= 36000m => taxableIncome * 0.03m - 0m,
> 36000m and <= 144000m => taxableIncome * 0.10m - 2520m,
> 144000m and <= 300000m => taxableIncome * 0.20m - 16920m,
> 300000m and <= 420000m => taxableIncome * 0.25m - 31920m,
> 420000m and <= 660000m => taxableIncome * 0.30m - 52920m,
> 660000m and <= 960000m => taxableIncome * 0.35m - 85920m,
> 960000m => taxableIncome * 0.45m - 181920m,
_ => 0,
};
decimal accumulatedIncomeAfterTax = accumulatedIncome - accumulatedTax;
Console.Write("累计税后收入:");
Console.Write(accumulatedIncomeAfterTax);
Console.WriteLine("元。");
使用前记得对累计收入和累计扣除额赋值。