Python告訴你:為何年終獎多發一元,到手卻少兩千多?

image
年終獎多發一元,到手卻要少兩千多,甚至更多。聽到這個訊息的時候,大家是不是覺得有點意外,意外之餘還有點淡淡的憂傷?
學習Python中有不明白推薦加入交流群
號:864573496 群裡有志同道合的小夥伴,互幫互助, 群裡有不錯的視訊學習教程和PDF!

image
上了這麼多年班,我也是最近才搞清楚年終獎的稅是怎麼算的。年終獎的稅和工資稅的最大區別就是,年終獎沒有階梯稅率,沒有階梯稅率,沒有階梯稅率,重要的事情說三遍。
具體怎麼算,我們來看下面的公式。

image
稅率和速算扣除數按照稅率表,最新的稅率表如下。

image
我們假設一個人的年終獎是30000元,因為沒超過36000元,查上表得到稅率3%,速算扣除數是0,因此他要交的稅是30000 * 3% - 0 = 900元 。
如果一個人的年終獎是120000元,因為在36000元~144000元的區間內,查上表得到稅率10%,速算扣除數210,所以他要交的稅是120000 * 10% - 210 = 11790元 。
基於年終獎稅的計算方式,我們用Python實現了一個算稅的函式。程式碼如下。
import bisect import numpy as np import matplotlib.pyplot as plt def bonus_tax(bonus): ranges = [0, 36000, 144000, 300000, 420000, 660000, 960000] deducts = [0, 210, 1410, 2660, 4410, 7160, 15160] rate = [0.03, 0.1, 0.2, 0.25, 0.3, 0.35, 0.45] i = bisect.bisect_left(ranges, bonus) tax = bonus * rate[i-1] - deducts[i-1] return tax
image.gif
上面的bonus_tax函式就是算稅的函式,它接受一個引數bonus,就是我們的年終獎。
我們用這個函式來算一下,從1000元到1000000元區間內所有年終獎的稅各是多少。具體程式碼如下。
if __name__ == "__main__": bonuses = range(10000, 1000000, 1) taxes = [] net_incomes = [] for bonus in bonuses: tax = bonus_tax(bonus) taxes.append(tax) net_incomes.append(bonus-tax) plt.plot(bonuses, net_incomes) plt.show()
image.gif
這段程式的末尾會將稅後年終獎和稅前年終獎的關係製作成一張折線圖,展現出來,如下。

image
橫軸是稅前的年終獎,縱軸是稅後拿到手的收入。可以看到上圖中稅後到手的收入和稅前年終獎並不是呈現單調遞增的關係,在幾個節點上會出現突然的下跌,也就是說稅前年終獎雖然增加了,但稅後到手的收入卻減少了。
這是為什麼呢?
我們注意到這些突然的下跌都是出現在跨稅檔的邊界上。比如36000元的年終獎,需要交的稅是36000 * 3% - 0 = 1080元 ,但36001元的年終獎,就需要交36001 * 10% - 210 = 3390元 的稅,年終獎增加一元,收入反而減少了。同樣的問題也出現在144000元、300000元、420000元、660000元、960000元這些年終獎上。在這些跨稅檔的邊界上,年終獎雖然增加了,但因為跨了稅檔,稅率提高了,導致稅後所得反而減少了。
出現這個問題的根本原因,還是在於年終獎的計稅存在一個漏洞。年終獎計稅的稅率是基於工資稅的稅率表,工資稅的稅率表上收入額這一欄是月收入,而上面的表格裡的收入額是年收入,收入額乘以了12,但速算扣除數沒有,這就導致跨稅檔的時候會出現收入突然下跌。
如果我們把上面表格中的速算扣除數都乘以12,再畫一下稅後年終獎和稅前年終獎的關係圖,可以得到下面的圖。

image
這張圖就正常多了,圖上沒有突然下跌的斷層,稅後年終獎和稅前年終獎呈現單調遞增的關係。
看到這裡,大家是不是理解了年終獎的計稅方式了呢?祝大家都能避開跨稅檔的陷阱~