一、新税率的计算方式

# 2018年12月21日,发布《个人所得税扣缴申报管理办法(试行)》中规定,扣缴义务人向居民个人支付工资、薪金所得时,应当按照累计预扣法计算预扣税款,并按月办理扣缴申报。
# 累计预扣法,是指扣缴义务人在一个纳税年度内预扣预缴税款时,以纳税人在本单位截至当前月份工资、薪金所得累计收入减除累计免税收入、累计减除费用、累计专项扣除、累计专项附加扣除和累计依法确定的其他扣除后的余额为累计预扣预缴应纳税所得额。
# 本期税费 = (累计税前收入 - 累计五险一金 - 累计起征点 - 累计专项减免 - 累计其它减免) * 税率表 - 累计已交税费
# 假设一个人税前工资20000,五险一金3500,专项减免1000
# 一月份缴税,(20000 - 3500 - 5000 - 1000) * 0.03 = 315
# 二月份缴税,(20000*2 - 3500*2 - 5000*2 -1000*2) * 0.03 - 315 = 315
# 因此在工资不变的条件下,我们可以得到一条计算当前月份个人所得税的公式,公式如下:
# 公式: 每月个税 = (税前工资 - 五险一金 - 起征点 - 专项减免) * 月份 * 税率 - 之前月份的个税,
# 但是,此公式只适用于工资不变的情况下,因为如果工资是变化的,累计税前收入 != 税前工资*月份。
# 因此,如果在工资不变的情况下,知道五险一金、专项减免的金额,就可以计算出一年中每个月的税后工资、个税。
二、Python版本代码
def calculator(money, ins, special=0):
"""
根据税前工资计算每个月的税后工资、个人所得税
:param money: 税前工资
:param ins: 五险一金
:param special: 专项减免
:return:
"""
m, r = [0, 36000, 144000, 300000, 420000, 660000.960000], [0.03, 0.1, 0.2, 0.25, 0.3, 0.35, 0.45]
s = '计算结果如下:
'
total_tax = 0
for i in range(1, 13):
month_tax = 0
extra = (money - ins - special - 5000) * i
if extra > 0:
for j in range(1, len(m)):
if extra > m[j]:
if j == len(m) - 1:
month_tax += (extra - m[j]) * r[j]
else:
month_tax += (m[j] - m[j - 1]) * r[j - 1]
else:
month_tax += (extra - m[j - 1]) * r[j - 1]
break
month_tax -= total_tax
s += '{}月份工资,税后:{},所得税:{}
'.format(i, money - ins - month_tax, month_tax)
total_tax += month_tax
else:
s += '{}月份工资,税后:{},所得税:{}
'.format(i, money - ins, 0)
return s
if __name__ == '__main__':
while True:
money = int(input('税前工资:'))
ins = int(input('五险一金:'))
special = int(input('专项减免:'))
print(calculator(money, ins, special))

三、配合前端显示

