🌂 个人所得税计算

前面学习了不同分支条件下的计算,我们再看一个计算个人所得税的例子,假设个人所得税的规则如下, 看下根据税前工资如何求出税后工资:

需求分析:

看需求,税费计算也是分成几个区间,有点类似出租车计价规则,所以程序整体结构会有些类似, 会用到多个分支语句。

每个分支里要计算出相应区间的税费,要想求出本区间的税费,先要知道落在本区间内有多少钱, 然后再乘以本区间的税率就可以了,百分比在程序里用浮点数表示,如 10% 用 0.1 表示

最后用税前工资减去各阶段的税费,就能得出税后工资。

根据上面的分析代码编写如下:

var salary = 1800; // 税前工资
var taxSalary = 0;  // 税后工资

// 各阶段起始点,不包含该点
var step1Begin = 1500;
var step2Begin = 4500;
var step3Begin = 9000;
var step4Begin = 35000;

// 各阶段税率
var baseRate = 0.03;
var step1Rate = 0.1;
var step2Rate = 0.2;
var step3Rate = 0.25;
var step4Rate = 0.3;

// 各阶段税费
var baseTax = 0;
var step1Tax = 0;
var step2Tax = 0;
var step3Tax = 0;
var step4Tax = 0;

if (salary > step4Begin) {    
    step4Tax = (salary - step4Begin) * step4Rate;
    step3Tax = (step4Begin - step3Begin) * step3Rate;
    step2Tax = (step3Begin - step2Begin) * step2Rate;
    step1Tax = (step2Begin - step1Begin) * step1Rate;  
    baseTax = step1Begin * baseRate;    
} else if (salary > step3Begin) {      
    step3Tax = (salary - step3Begin) * step3Rate;
    step2Tax = (step3Begin - step2Begin) * step2Rate;
    step1Tax = (step2Begin - step1Begin) * step1Rate;  
    baseTax = step1Begin * baseRate;
} else if (salary > step2Begin) {  
    step2Tax = (salary - step2Begin) * step2Rate;
    step1Tax = (step2Begin - step1Begin) * step1Rate;  
    baseTax = step1Begin * baseRate;
} else if (salary > step1Begin) {    
    step1Tax = (salary - step1Begin) * step1Rate;   
    baseTax = step1Begin * baseRate;        
} else {
    baseTax = salary * baseRate;
}

taxSalary = salary - baseTax - step1Tax - step2Tax - step3Tax - step4Tax;

console.log(taxSalary);

注意:一定要处理好数据边界,正确使用 ><= 等关系操作符,不能重复计税,也不能漏掉计税。

当税前工资为 1800, 上面程序运行结果是 1725,看下跟你用纸笔或口算的结果一样吗?

下面再提供几个程序输出感受一下各种级别工资的扣税情况:)

税前工资 税后工资
5000 4555
12000 10005
38000 29355

进入下一页

🌂 另一个版本

前面计算税费的例子,包括出租车的例子,都是在大的分支里把小的分支里的逻辑也算一遍, 有没有其它的方式,让各区间只做自己的计算呢?

比如第一阶段的税费计算,其实就是如果税前工资只超过第一阶段起始点,没超过第二阶段 起始点的话,那么该区间的税费就是 (salary - step1Begin) * step1Rate

而如果税前工资既超过了第一阶段起始点,同时也超过了第二阶段起始点,那么这个区间的税费 就是这个区间的最大税费 (step2Begin - step1Begin) * step1Rate

写成代码的话,就是如下:

// 税前工资只超过了第一区间起始点,没超过第二阶段起始点
if (salary > step1Begin && salary <= step2Begin) {
    step1Tax = (salary - step1Begin) * step1Rate;
}

// 税前工资既超过了第一区间起始点,也超过了第二阶段起始点
if (salary > step1Begin && salary > step2Begin) {
    step1Tax = (step2Begin - step1Begin) * step1Rate;
}

其它分支做相应的修改,最后整体代码改动如下

var salary = 1800; // 税前工资
var taxSalary = 0;  // 税后工资

// 各阶段起始点,不包含该点
var step1Begin = 1500;
var step2Begin = 4500;
var step3Begin = 9000;
var step4Begin = 35000;

// 各阶段税率
var baseRate = 0.03;
var step1Rate = 0.1;
var step2Rate = 0.2;
var step3Rate = 0.25;
var step4Rate = 0.3;

// 各阶段税费
var baseTax = 0;
var step1Tax = 0;
var step2Tax = 0;
var step3Tax = 0;
var step4Tax = 0;

// 基础税率
if (salary <= step1Begin) {
    baseTax = salary * baseRate;
} 
if (salary > step1Begin ){
    baseTax = step1Begin * baseRate;
}

// 第一阶段税率
if (salary > step1Begin && salary <= step2Begin ) {
    step1Tax = (salary - step1Begin) * step1Rate;
}

if (salary > step1Begin && salary > step2Begin) {
    step1Tax = (step2Begin - step1Begin) * step1Rate;
} 

// 第二阶段税率
if (salary > step2Begin && salary <= step3Begin ) {
    step2Tax = (salary - step2Begin) * step2Rate;
}

if (salary > step2Begin && salary > step3Begin) {
    step2Tax = (step3Begin - step2Begin) * step2Rate;
} 

// 第三阶段税率
if (salary > step3Begin && salary <= step4Begin) {
    step3Tax = (salary - step3Begin) * step3Rate;
}

if (salary > step3Begin && salary > step4Begin) {
    step3Tax = (step4Begin - step3Begin) * step3Rate;
} 

// 第四阶段税率
if (salary > step4Begin) {    
    step4Tax = (salary - step4Begin) * step4Rate;
}

taxSalary = salary - baseTax - step1Tax - step2Tax - step3Tax - step4Tax;

console.log(taxSalary);

上面这个版本去掉了 else if 逻辑,每个区间只计算本区间的税费,这样每个阶段的计算独立性 会强一些,不需要考虑其它区间的情况。


进入下一页

👍小测验

下面是一个简易版的税费计算程序,分析它是否有 BUG

var s = 1800;
if (s < 1800) {   
    s = s * ( 1 - 0.05);   
} else if (s > 1800 && s < 4500) {
    s = 1800 * (1 - 0.05) + (s - 1800) * (1 - 0.1);   
} else {  
   s = 1800 * (1 - 0.05) + (4500 - 1800) * (1 - 0.1) + (s - 4500) * (1 - 0.2);   
}
console.log(s);
没有错误
关闭

第二个分支里并没有处理 s = 1800 的情况,一定要处理好边界哦。

有错误
关闭

恭喜您!回答正确,可进入下一关


进入下一页

小结

本章节我们实现了一个个税计算程序,并且通过优化让它更清晰, 虽然没有新知识,但代码有些多,可以多看几遍,加深理解。


完成本节学习