前言
新个税已经出来一年多了,发现其实还有挺多小伙伴并不清楚个税是怎么计算的,年终奖是怎么扣除的,不过没关系,毕竟没有程序员解决不了的事情,如果有,请给我换个秃头的程序员[手动滑稽]。话不多说,让我们先从计算个人所得税的几个重要概念说起,当然,如果不想了解概念直接看代码的也可以直接拖到最下面复制代码。
应纳税所得额
应纳税所得额 = 工资 - 起征点 - 专项附加扣除 - 五险一金
-
起征点
2019年起,个人所得税起征点改为5000 -
专项附加扣除
子女教育:纳税人的子女接受全日制学历教育的相关支出,按照每个子女每月1000元的标准定额扣除。
继续教育:纳税人在中国境内接受学历(学位)继续教育的支出,在学历(学位)教育期间按照每月400元定额扣除。同一学历(学位)继续教育的扣除期限不能超过48个月。纳税人接受技能人员职业资格继续教育、专业技术人员职业资格继续教育的支出,在取得相关证书的当年,按照3600元定额扣除。
住房贷款:纳税人本人或者配偶单独或者共同使用商业银行或者住房公积金个人住房贷款为本人或者其配偶购买中国境内住房,发生的首套住房贷款利息支出,在实际发生贷款利息的年度,按照每月1000元的标准定额扣除,扣除期限最长不超过240个月。纳税人只能享受一次首套住房贷款的利息扣除。
住房租金:纳税人在主要工作城市没有自有住房而发生的住房租金支出,可以按照以下标准定额扣除:
(一)直辖市、省会(首府)城市、计划单列市以及国务院确定的其他城市,扣除标准为每月1500元;
(二)除第一项所列城市以外,市辖区户籍人口超过100万的城市,扣除标准为每月1100元;市辖区户籍人口不超过100万的城市,扣除标准为每月800元。
赡养老人:纳税人赡养一位及以上被赡养人的赡养支出,统一按照以下标准定额扣除:
(一)纳税人为独生子女的,按照每月2000元的标准定额扣除;
(二)纳税人为非独生子女的,由其与兄弟姐妹分摊每月2000元的扣除额度,每人分摊的额度不能超过每月1000元。可以由赡养人均摊或者约定分摊,也可以由被赡养人指定分摊。约定或者指定分摊的须签订书面分摊协议,指定分摊优先于约定分摊。具体分摊方式和额度在一个纳税年度内不能变更。
其中住房贷款和住房租金只能二选一。 -
五险一金
五险一金包括养老保险,医疗保险,失业保险,生育保险,工伤保险和住房公积金。以上海为例,五险一金的比例是:
个人:养老保险 8%,医疗保险 2%,失业保险0.5%,住房公积金7%,工伤保险0%,生育保险0%;
公司:养老保险20%,医疗保险10%,失业保险0.5%,住房公积金7%,工伤保险0.3%,生育保险1%;
我们计算个税只用个人的就可以了,合计是17.5%。
例子:小王在上海工资两万,且在上海租房,每月可扣除1500专项附加费,那他的应纳税所得额计算如下:
应纳税所得额 = 20000 - 5000(起征点) - 1500(专项附加扣除) - 20000 * 17.5%(五险一金) = 10000
税率
级数 | 累计预扣预缴应纳税所得额 | 预扣率(%) | 速算扣除数 |
---|---|---|---|
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 |
有了税率,我们便可以方便的计算工资了。
例子:好了小王他又来了,假设小王的一年的累计预扣预缴应纳税所得额(后面会解释)为120000,那么他今年要缴纳的个人所得税为如下公式:
个人所得税 = 36000(不超过36000元的部分) * 0.03 + (120000 - 36000)(超过36000元至144000元的部分) * 0.1 = 9480
那既然都能算出个税的结果了,表格最后一栏的速算扣除数是干啥用的?既然你诚心诚意的问了,额,好吧,你不问我也要说。
速算扣除数
为了方便计算个税,避免分段计算,国家给出了速算扣除数,并通过以下公式使用:
个人所得税 = 应纳税所得额 * 税率 - 速算扣除数
我们不妨验证一下(呼叫小王):
个人所得税 = 120000(144000元~300000元) * 0.1 - 2520(速算扣除数) = 9480
是不是恍然大悟了呢,根据上表的预扣率,其实我们不用国家给,自己也能计算出每个阶段的速算扣除数[手动傲娇]。
2520 = 36000 * (0.1 - 0.03)
16920 = 2520 + 14400 * (0.2 - 0.1)
31920 = 16920 + 300000 * (0.25 - 0.2)
52920 = 31920 + 420000 * (0.3 - 0.25)
(我吐了,我的工资又不用交这个档的税,我算那么多干嘛...不算了!)
累计预扣缴额
上面提到了这个概念,这里解释一下:
以前是以每个月工资金额扣税,19年开始以一年以内按照每个月叠加进行按年计税。
1月份扣税,以第一个月应纳税所得额为基数
2月份扣税,是以前两个月应纳税所得额为基数
3月份扣税,是以前三个月应纳税所得额为基数
...
以此列推
计算每月工资
为了计算每月工资,可以使用如下几个公式
当月工资 = 基本工资 + 浮动奖金(绩效工资) - 当月应缴税 - 五险一金
其中基本工资
,浮动奖金
,五险一金
均已知,我们只需计算当月应缴税
当月应缴税 = 当月累计应缴税 - 上月累计应缴税(累计已缴税)
所以我们需要求得每月累计应缴税,公式如下:
累计应缴税 = 累计应缴税额 * 税率 - 速算扣除数
(个人所得税 = 应纳税所得额 * 税率 - 速算扣除数
)
税率
和速算扣除数
与累计应缴税额
有关,我们只需要求得每月的应缴税
额然后累加即可
每月的应缴税 = 基本工资 + 浮动奖金(绩效工资) - 起征点 - 专项扣除 - 五险一金
经过上述分析,我们已经总结出了整个程序的公式。下面展示代码
代码
import java.util.ArrayList;
import java.util.List;
public class IncomeFax {
public static void main(String[] args) {
// 小王每月工资两万,浮动奖金为0,专项扣除费为1500,上海的五险一金比例为17.5%
System.out.println(getMonthlySal(20000, new double[12], 1500.0, 0.175));
}
/**
* @param defaultSal 基本工资
* @param bonus 浮动奖金(绩效工资)一年内拿了几次工资就输入几个
* @param special 专项扣除
* @param insurance 五险一金比例
*/
public static List<Double> getMonthlySal(double defaultSal, double[] bonus, double special, double insurance) {
// 累计预扣缴额
double totalNeedTax = 0.0;
// 累计已缴税额
double totalHadTax = 0.0;
// 每月工资
List<Double> salArr = new ArrayList<>();
for (double b : bonus) {
// 当月预扣缴额(每月的应缴税 = 基本工资 + 浮动奖金(绩效工资) - 起征点 - 专项扣除 - 五险一金)
double shouldTax = defaultSal + b - 5000 - special - defaultSal * insurance;
totalNeedTax += shouldTax;
// 累计应缴税额(累计应缴税额 * 税率 - 速算扣除数`)
double totalTax;
if (totalNeedTax <= 36000.0) {
totalTax = totalNeedTax * 0.03;
} else if (totalNeedTax <= 144000.0) {
totalTax = totalNeedTax * 0.1 - 2520;
} else if (totalNeedTax <= 300000.0) {
totalTax = totalNeedTax * 0.2 - 16920;
} else if (totalNeedTax <= 420000.0) {
totalTax = totalNeedTax * 0.25 - 31920;
} else if (totalNeedTax <= 660000.0) {
totalTax = totalNeedTax * 0.30 - 52920;
} else if (totalNeedTax <= 960000.0) {
totalTax = totalNeedTax * 0.35 - 85920;
} else {
totalTax = totalNeedTax * 0.45 - 181920;
}
// 当月应缴税(当月累计应缴税 - 上月累计应缴税(累计已缴税))
double curTax = totalTax - totalHadTax;
// 当月工资(当月工资 = 基本工资 + 浮动奖金(绩效工资) - 当月应缴税 - 五险一金)
double curSal = defaultSal + b - curTax - defaultSal * insurance;
salArr.add(curSal);
totalHadTax = totalTax;
}
return salArr;
}
}
以上代码能打印出每月的工资,如果你有需要,也可以打印出代码中注释的任何内容。赶紧复制代码来算算自己的工资吧,下一篇教你如何计算你的年终奖。