今天才知道年终奖一次性计税的惊天 bug

2024-02-02 20:05:33 +08:00
 unt
36100 拿到手比 36000 少,请问大家真的是这样吗,上小学时的一道数学题成了现实了。
24813 次点击
所在节点    职场话题
170 条回复
nothingistrue
2024-02-05 09:29:45 +08:00
@mschultz 哥们看一下我单独发的主题,虽然现在这种算法问题很大,但你希望那种方式是不可能存在的。
GuuJiang
2024-02-05 09:57:43 +08:00
@changnet 那为什么不能是 36001x10%-2520=1080.1 呢?这难道不是更优惠?说白了,在正确的版本中(比如月薪),法律文本明确写了,3000 以下税率为 3%,**3000-12000 的部分**按 10%,基于这个前提才算出了速算扣除数为 210 这个数字,所以可以明确地回答以下问题
1. 我国的征税税率是多少?
答:超额累进税率,3000 以下 3%,3000-12000 的部分 10%,等等
2. 计算公式 3001*10% - 210 中的-210 的含义是什么?
答:是对上述的超额累进税率进行计算的过程中产生的一个中间结果,相当于把超额累进当成全额累进计算后多出的部分,减去以后就能还原为超额累进
而在 36001x10%-210 这个公式里,能回答上述两个问题吗?根本就不能,假如把物理公式中的量纲的概念进行一个广义的推广的话,可以说这个公式连量纲都不对

问题的真正本质是,对于一个税收策略的制定者,可供他调整的参数包括:
1. 全额累进还是超额累进
2. 各档次的区间以及税率
至于速算扣除数,压根就不是一个自由的参数,是在当选择了超额累进策略以及确定了区间和税率后自然就确定了的一个值,它的值完全由区间和税率来决定,拿 excel 举例的话,前两个参数是用户可以自由输入的值,而速算扣除数那里放的应该是一个公式,根本就不应该由用户去输入

而由于“减去速算扣除数”那个版本的公式太过于深入人心,导致了很多人,包括年终奖政策制定者,实际操作的人员,以及这个帖子里的一部分人,都把它当成了原始的公式,误以为速算扣除数是一个可以根据各种理由去自由调整的参数,于是把讨论的方向歪到了“速算扣除数应该选多少才合适”上去

政策制定者真正应该去操作的是选择全额还是超额,以及确定区间和税率,如果选择了全额,那么自然就不存在速算扣除数,也就是你们所说的不减或者减 0 的情况,如果选择了超额,那么就应该在确定完区间和税率后重新计算出新的速算扣除数,也就是说对于全额/超额,以及区间和税率的选择,才具备讨论的基础,区间合不合理,税率高了还是低了,在这类问题上才值得各方根据自己的观点进行辩论,而对于一个原本是由其他的参数间接确定的值去讨论取多少合适,以及取值的理由,只能说 not even wrong
GuuJiang
2024-02-05 12:06:42 +08:00
https://docs.google.com/spreadsheets/d/1smAmln56i3CJyh4vrFQWMzuvIsZlBks7i9Z78E1zfXc/edit?usp=sharing

做了一个表格,如果结合这个表格都还看不懂问题出在哪里那就确实没有讨论的必要了
其中 A 列指定各区间起点,B 列指定各区间税率,C 列中使用公式通过 AB 两列的数据计算出了速算扣除数,是不是和官方文件中正确版本的取值完全一样?然后把 A 列和 B 列换成历史上曾经推出过的文件中的区间和税率,是不是发现 C 列的结果仍然和文件里是吻合的? F 列是通过超额累进的原始定义的公式来计算税,而 G 列是使用了速算扣除数版本的公式,可以看到二者计算结果完全相同,但是 G 列的公式更简洁,这才是速算扣除数的本质含义

@snw 你一直在强调本质,那请问下,在 3001*10%-210 和 36001*10%-2520 这两个公式里,我可以回答出-210 和-2520 的本质是什么,而在 36001*10%-210 这个公式里,你能说出这个-210 的本质吗?难道就是个为了达到“优惠但又不完全优惠”这个目的而随意添加的一个任意的值吗?你一直强调相比起不减速算扣除数(其实也就是选择了全额累进)来说“优惠”了,如果不想给优惠,那就直接选择全额累进,如果想要给优惠,那就老老实实提供正确版本的超额累进,如果觉得照搬月薪的区间优惠力度太大了,那完全可以根据实际情况去调整区间和税率(也就是表格里的 AB 列),并且计算出新的 C 列,而不是现在这个结果
政策制定者的真正想法确实是一出罗生门,我们所有人能做的只有分析和猜测,但是从一般人的常理出发,你觉得是
A:原本想要制定一个超额累进的策略,但是没有真正理解超额累进的公式含义,把一个化简后的公式当成了原始公式,搬错了参数
还是
B:出于某些我等 P 民无法理解的苦心,去精心设计了一个形式上长得像超额累进的简化版公式,同时照搬了另一个已有的超额累进公式里的一组参数,然后事后声称这个既不是全额累进,也不是超额累进,而是为了给优惠而精心设计的第三种世界上还不存在的税收算法,所有不理解背后的良苦用心的人都是哗众取宠的小丑
这两种哪种的概率更大?
snw
2024-02-05 12:12:12 +08:00
@chairuosen
首先,上面提出的那些简单的改 bug 方案是违背业务逻辑的,这比一个有部分意外结果的不优雅的业务逻辑更糟糕。
其次,这个问题已经被“年度综合所得”方案彻底解决了,所以剩下的问题只是什么时候把过时补丁删掉罢了,不需要再修改补丁。
最后,老用户也是用户,所以政策变动一般会考虑延续性。

@kkbblzq
并不是唯权威论。我已经介绍了前因后果,也没有认为这个方案没问题。我想说的是,你们能想到的“正确方案”要么错得更大,要么不具可操作性。另外,彻底的修正已经上线了,没必要再改这个临时的补丁。
snw
2024-02-05 12:23:42 +08:00
@GuuJiang
你会提出全额累进,以及你提出的参数建议,说明你压根没理解业务逻辑。

请理解(1)“把年终奖摊到 12 个月的月度收入之上继续适用超额累进税率”与(2)“把年终奖摊到额外的 12 个月,每个月单独适用超额累进税率”这两种业务逻辑的区别。

对于第 1 种,实操中还需要由人事/会计给每个人添加每个人月度收入的参数,并且这个参数每月是不同的,并且如果一次性奖金不是在最后一个月发你都没法确定这个参数。
对于第 2 种,从业务逻辑上就不是这样设计的。
GuuJiang
2024-02-05 12:30:02 +08:00
@snw 无论是上述两种中的哪一种,最终都不可能推得出 36001*10%-210 这个公式,请正面回答下,这个公式里的-210 这个数值的本质含义是什么?
zizon
2024-02-05 14:02:23 +08:00
大家着重看下 120L 再吵
jobscolin
2024-02-05 15:26:19 +08:00
一群“数学家”再争吵
GuuJiang
2024-02-05 16:26:53 +08:00
@snw
> 我是(半个)业务部门,我很讨厌开发用“代码优雅性”、“我觉得应该怎样怎样”来试图直接篡改业务逻辑。
由业务逻辑导致的意外结果,而且有 workaround 的情况下,应该先制定业务逻辑的改进方案,而不是想当然地直接改代码。

引用你自己说的这段话,什么叫作业务逻辑?“3000 以下税率为 3%,3000-12000 的部分税率为 10%”,这种才叫业务逻辑,因为它是用自然语言描述,并且也白纸黑字地写在了官方的文件里,任何一个读懂了这段文字的人都能够计算自己应该交的税,比如我工资 5000 ,交税 290 ,我能对照着官方文档中的业务逻辑清楚地知道每一分钱的来龙去脉,5000 当中的 3000 按 3%应交 90 ,另外 2000 按 10%应交 200 ,合起来一共 290 。这个过程中是不是完全没有用到 210 这个数字?因为“3000 以下税率为 3%,3000-12000 的部分税率为 10%”这段文字已经使用描述一个税收政策所使用的通用语言给出了这个政策的全部信息,至于 5000*10%-210 ,反而不属于业务逻辑,而是实现层面的其中一种选择,实现者可以选择用这个公式,也可以选择不用,总之只要从原始的业务逻辑出发,一定能够得到正确的结果,而过去的文件把某一种具体实现中推导出来的一个常数也写在了业务逻辑里,本身就是不合理的,也为后面的事件埋下了伏笔,因为把 210 写到文件中,首先就在业务逻辑中干涉了具体的实现方式,其次这个 210 和前面的税率其实是在使用两种不同的方法描述了同一个业务逻辑,那就给制定业务逻辑的人增加了额外的风险,就是必须要维护这两个数字之间的一致性,比如已经说了“3000 以下税率为 3%,3000-12000 的部分税率为 10%”,那后面对应的速算扣除数就只能是 210 ,根本没有别的选择,一旦变成了其他的数字,就会和前面的描述自相矛盾,并且每次调整了区间和税率时,扣除数必须得要跟着一起变
而后面的年终奖恰恰就踩中了前面埋的这个坑,在 36001*10%-210 这个例子中,根本就做不到像上面一样使用自然语言描述出 36001 中哪一部分的税率是多少,别说 210 了,连 10%都变得无法解释,因为你根本就没法说清楚 10%到底表示哪一部分的税率,这难道不属于业务逻辑有 bug ?
只要是人都会犯错,权威也不例外,一个有错误的文件已经正式发布了,那么在被修改或者废止之前就只能照着执行,这个大家都可以理解,哪怕去论述为什么不能修改,也勉强可以接受,但是非要去说“原本就是故意这样设计的”、“这是更优的选择”,那就简直是在把大家当傻子了,原本这个错误知道的人也不多,从这个帖子的讨论就可以看出很多人也是第一次才知道的,哪怕知道也并不一定完全清楚细节,你非要坚持不余遗力地去为之辩解,导致更多的人了解到这个错误是多么的低级,税务部门内心表示听我说谢谢你
snw
2024-02-05 21:13:04 +08:00
@GuuJiang
我 145 楼、120 楼等已经重复解释过很多遍业务逻辑了,如果你思路还转不过弯来那我真没办法教会你。

最后实现的公式不需要你所谓的一一对应的“意义”,你讨论一大通公式哪一部分具体对应什么东西是没意义的。
GuuJiang
2024-02-05 22:54:48 +08:00
@snw 是你一直思路转不过弯来,一直没有明白“速算扣除数”不是一个可以由制定业务逻辑的人指定的值,他能够指定的只有区间和税率,速算扣除数是实现层面的产物,所以“速算扣除数取多少值合理”这个问题从根上就不应该拿来讨论,如果你想要反驳这一点,请正面回答我前面提出的几条疑问,而不是用一句“不需要意义”搪塞过去,如果你所认为的业务逻辑居然连“用普通人能理解的自然语言描述”这一条都满足不了,而是要借助另一个业务在实现过程中产生的公式来描述,你觉得那可以称为一个业务逻辑吗?连描述里面涉及到的每一个常数的意义都解释不出来,还能称之为一个业务逻辑吗?
如果这还是理解不了,不妨来做个思想实验,假设在另一个平行宇宙里,最开始的月收入那个版本给出的值不是一个“速算扣除数”,而是一个“速算增添数”,取值如下表:
(0, 3000): 0
(3000, 12000): 90
(12000, 25000): 990
并且把计算公式修改为(x - 所属档次的起点)*所属档次税率 + 速算增添数,比如 12002 的所得税=(12002-12000)*20%+990=990.4
这个“速算增添数”是不是比“速算扣除数”更优秀?
第一,速算增添数的计算变得更简单了,下一行的速算增添数可以在上一行的基础上递推
第二,最终的公式变得更好理解了,更加直观地体现出了超额累进的过程
那么假如把现行的月收入的政策中的“速算扣除数”替换为“速算增添数”的版本,相信你不会有意见吧?因为这样的修改对最终税收的计算不会有任何影响,和“速算扣除数”的版本原本就是完全等价的

好了,接下来在这个平行宇宙里,接着重演年终奖的故事,那么最终的版本就会变为
年终奖 36000 的人,税为 36000*0.3=1080
而年终奖 36001 的人,则变成了
(36001-36000)*10%+90=90.1
于是网上讨论的标题不再是《年终奖多发一元,到手少千元》,而是变成了《年终奖多发一元,到手多千元》,那你觉得在这种情况下,从有人指出有问题到税务部门修改算法,需要经历几天?

月收入明明采用了两种完全等价的方法去定义,但是相对应的年终奖却产生了两种截然不同的结果,你觉得问题出在哪呢?仔细想清楚这些问题,再决定要不要继续坚持你的观点吧
Padawan
2024-02-06 08:35:11 +08:00
@snw 你还是太年轻。这个事情就是一开始就搞错了但修正对于政策制定者来说很麻烦,不修正也影响不到他们的利益,就劳烦全国劳动人民一起将错就错。
部委的这些政策都是基层小职员拟一个初稿然后层层审批,负责审批的上级根本懒得管这些细节。等公布出去发现有问题时,那么多章都敲过了,认错重来要追责的。不认错也没(上面的人)管
snw
2024-02-06 08:42:42 +08:00
@GuuJiang
再读读 120, 145, 150 楼吧,你仍然没有理解我重复了很多遍的业务逻辑。

速算算法本来就是怎么简单怎么来,而不是什么好理解。你给出的月收入“速算添加”算法并不比速算扣除有什么优势,甚至实操上更麻烦(多一个参数),2005 年仍有不少企业的工资表是手动算的(纸+笔+计算器),多减一个数就多一分工作量。

顺便说一句,如果平行宇宙的税务局把“速算扣除”算法套用到全年一次性奖金计算上,那么减的边界数也会是按月度表来的,结果仍是跳增而非跳减🐶
36000*3%=1080
(36001-3000)*10%+90=3390.1
wupher
2024-02-06 09:27:35 +08:00
明明是 bug ,非要硬洗。对,砖家不会错。千万不要智疑,你说的都对。
GuuJiang
2024-02-06 09:58:08 +08:00
@snw 我完全充分理解你想要表达的所有观点,但是反过来你却并没有理解或者说尝试去理解我的观点
我来从头理一遍你的逻辑,然后一一指出你的逻辑里有哪些陷阱
1. 如果把年终奖并入当月工资计税,会导致税收太高,对劳动者不公平,在这个背景下税务部门开始制定新的税法,这点我完全同意
2. 接下来有 4 种备选方案,按缴税额从高到低依次称为 ABCD 下面我来逐个分析
3. 方案 A:也就是你说的本质,即把年终奖分摊到 12 个月中去合并计税,并且以原本的月收入为起点继续超额累进,我完全同意你说的这个才是年终奖税本来应该有的样子,这个方案对国家来说是最公平的,但是**直接计算年终奖的税**实操较困难,这点我也同意,但是实际也没有那么的困难,只要抛开直接计算这个固有观念,先把分摊后的部分累加以后整体算一个税,再减掉之前月收入已经交过的税,是不是就解决了?实际也没增加多少困难
4. 方案 B:36001*10%,不减速算扣除数,用业务语言描述,相当于把年终奖分摊到凭空多出来的 12 个月上,然后进行全额累进
5. 方案 C:36001*10%-210 ,也就是现行方案,用业务语言根本无法描述
6. 方案 D:36001*10%-2520 ,用业务语言描述,相当于把年终奖分摊到凭空多出来的 12 个月上,然后进行全额累进
7. 约定完上述记号后,我们来一起逐条分析你的逻辑,首先,你说方案 D 的问题是“210*12 后导致了实际上相当于分摊到了凭空多出来的 12 个月,偏离了本质(其实就是说离方案 A 更远了)”,但是你发现没,这个问题在方案 BCD 中都同样存在,造成这个问题的根本原因是重新以 0 为起点计算税率,只要选择了以 0 为起点计算,自然就已经造成了这个结果了,和 210 乘不乘 12 根本没关系,也就是说在“偏离本质”这个缺点上,BCD 之间只有量变没有质变,大家都是 50 步笑百步而已
8. 其次,你说方案 C 比方案 B 更优惠,从结果来看确实没错,但是和上面类似,要说优惠的话 BCD 都比 A 要优惠,并且带来优惠的大头贡献仍然是“重新以 0 计算起点”,和这个相比,后面的速算扣除数减多少对于大多数人来说已经无关痛痒了,C 相比 B 带来的仍然只是量变而非质变
9. 所以你的所有逻辑无非就是,C 比 D 更“接近本质”,比 B 更“优惠”,所以 C 是最优的选择,我没有总结错吧?这里就体现出你的一个陷阱了,要寻找一个平衡的方案这点本身没有错,但是应该是在 A 到 D 这个范围中寻找,而不是在 B 到 D 这个范围,碰巧 B 和 D 的公式长得只相差后面的速算扣除数,于是造成了“减去一个介于 210 和 2520 中间的数是一个更合理的方案”这样的假象,并且夸大了方案 C 对于两种优势的贡献程度,成功把部分人带进了沟里,得出了“虽然方案 C 不合理,但是方案 D 更不合理,并且方案 C 比方案 B 更优惠”这样一个很具有迷惑性的结论
10. 而我的观点是,我完全同意应该综合考虑公平性和易操作性,去寻找一个介于 A 和 D 之间的方案,这个目的应该通过制定一组新的区间和税率来完成,而不是去修改公式里的速算扣除数,虽然说从业务出发-2520 似乎离 A 更远,但是从数学角度出发却是“选定了 36000 和 10%”这个前提下的唯一解,你说的“把-210 改成-2520 只会造成更大的不平衡”这个观点看起来好像很有道理,问题是造成这个不平衡的是从数学角度出发支持把-210 改成-2520 的那些人吗?不是,而是选择了 36000 和 10%的那个人,从它选择了这组数那一刻起,就已经决定了后面只可能是-2520 ,你为什么不去抨击选择了 36000 和 10%的人而要反过来抨击指出数学不合理性的人呢,为什么仅仅因为-210 看起来更平衡而宁愿选择放弃数学合理性,而不是去选择真正合理的方案:即调整 36000 和 10%这两个数呢?
11. 方案 ABD 都值得拿来讨论和对比,因为他们各自都具备明确的业务含义,而方案 C 连参加这场对比的入场资格都不具备,因为他是一个不自洽的,无法用业务语言来描述的畸形方案,你比起直接认为应该无脑改 D 的人来说确实看得远了一步,但也正是这种自信蒙蔽了你的双眼,拒绝去思考方案 C 的天生缺陷,我从头到尾都没有去讨论过 C 和 D 哪个更优的问题,一直都只是在论述为什么 C 不具备成为备选项的资格,包括我举的那个思想实验的例子,也是换一种角度指出滥用量纲不正确的公式会造成多么荒谬的结果,如果你无法理解这个实验和现实情况之间的联系,以及为什么应该-36000 而不是-3000 ,真心建议你好好补习下数学中的抽象思维能力
12. 然后就是最后一个问题,为什么有那么多的人指出-210 应该是原本-2520 的误用,因为这个错误首先太明显,其次里面有太多的巧合,“工作人员充分地思考了各种方案的利弊,为了寻找一个合理的平衡方案,哪怕明知将来要被骂,也要自己默默承担一切,坚持为广大劳动人民谋福利”这种可能性的说服力远远比不上“当初可能根本就没想那么多,本来就是想直接设计出方案 D ,并且懒得再单独给出一组分界点为 36000 ,扣除数为 2520 的表格,而是让实操人员除以 12 后去查 3000 的那个表,结果无意中搞错了 210 的倍数”这种可能性,只不过在被爆出问题后,事后诸葛地发现了“方案 D 同样也不合理”这一理由
GuuJiang
2024-02-06 10:00:35 +08:00
@GuuJiang 上面第 6 段里有处笔误,“全额累进”应为“超额累进”
Hozoy
2024-02-06 10:51:48 +08:00
竟然没进水深火热🤔
GuuJiang
2024-02-06 11:41:21 +08:00
@snw 本来我还觉得你前面说的从业务逻辑角度出发的分析还体现出了你比其他人更理性的一面,别人喷你喷得有点冤,但是从这里的回复看你已经开始逐渐往为杠而杠的方向上发展了,好吧,我继续回应
你要说“速算增添数”不比“速算扣除数”优秀,OK ,我同意,因为这本来就不是这个类比的重点,这个类比是想要说明,无论“速算扣除数”还是“速算增添数”,在计算上都是完全等价的,因为它们分别都是从超额累进的原始定义出发推导出的两种中间结果,这两种中间结果在正确使用的前提下都没有问题,但是一旦忽略了适用条件产生了误用,就会形成完全相反的结果
你说的应该是-3000 而不是-36000 ,这个错误简直比起“-210 还是-2520”那个错误还要离谱,但是好处是足够明显,所以也许可以作为一个很好的切入点来帮你理解-210 到底错在哪里,先叠个甲,接下来我会使用一些需要具备一定的抽象思维能力才能理解的不严谨的设定,如果你理解有困难,请自行去咨询学数学和学物理的朋友,让他们给你解释,如果我们给前面出现过的所有公式里的一些数字添加上量纲,年终奖的数字量纲为“元”,12 的量纲为“月”,那么元除以月得到了“元/月”,“元/月”乘以月得到元,于是你就会发现 36001 这个和 3000 这两个数字的量纲都不一样,而量纲不一样的数字之间根本就不可能执行加减运算,其实原本的那个错误里之所以-210 应该变成-2520 ,根本原因绝不是像你想的那样“一群数学家为了让数字变得好看而强心凑上去的一个值”,而是乘以 12 后把量纲从元/月变成了元,这样才能和元进行加减运算,“速算扣除数”和“速算增添数”的两个例子里,都是减去或者加上了一个量纲不正确的量,而一旦把量纲修正了,二者都能同时得到正确的结果 1800.1 ,这从另一种角度揭示了原本那个错误的本质
snw
2024-02-06 12:27:39 +08:00
@Padawan
地税局或地方国税局可能会有你说的这种情况,但这是国税总局发文,而且不是针对某个(些)纳税人的定向政策,不要太想当然了。
silerLee
2024-02-06 19:45:29 +08:00
很多满减不也是这样么.外面 30-5 .你买了 28 了.多两块钱.没觉得有多逆天不影响事物本质啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1013749

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX