求一段算法:用递归的方法计算个人所得税(200分)

  • 主题发起人 主题发起人 kite20020304
  • 开始时间 开始时间
K

kite20020304

Unregistered / Unconfirmed
GUEST, unregistred user!
不考虑起征点,假设各段的税率为:
V1 ~ V2 R1
V2 ~ V3 R2
V4 ~ V5 R3
...
Vn-1 ~ Vn Rn
 
type
TTaxRec=record
StartMoney: Double
//分段起点
TaxRate: Double
//段内税率
end;
const
TaxData:array [0..4] of TTaxRec=(
(StartMoney:0
TaxRate:0),
(StartMoney:2000
TaxRate:0.05),
(StartMoney:3000
TaxRate:0.10),
(StartMoney:5000
TaxRate:0.15),
(StartMoney:10000
TaxRate:0.25)
);
function CalTax( Money: Double
StartLevel: Byte=0): Double;
begin
if (StartLevel>=High(TaxData)) or (Money<=TaxData[StartLevel+1].StartMoney) then
begin
with TaxData[StartLevel] do
Result:=(Money-StartMoney)*TaxRate;
exit;
end;
with TaxData[StartLevel] do
Result:=(TaxData[StartLevel+1].StartMoney-StartMoney)*TaxRate + CalTax(Money,StartLevel+1);
end;

eg:
ShowMessage(Format('1000 %.2f, 2500 %.2f, 20000 %.2f',[CalTax(1000),CalTax(2500),CalTax(20000)]););
 
把每段的基数算出来就好了哎
没必要这么烦
 
感谢 creation-zy
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3930093
请继续关注该帖

**************************
【延伸一】
**************************
function CalTax( Money, Sum: Double
StartLevel: Byte=0): Double;
sum为累计(本次起点,非起征点),例: Money=5000
sum=2100
算法为: 2100~ 3000: 900*0.05
3000~ 5000: 2000*0.10
5000~10000: 2100*0.15
 
有没有学过税法呀,所得税有速算扣除数的,一个IF就可以搞定了.
 
不会的话找财务或学过会计的人.网上搜搜也行.很简单.
 
呵呵,本帖的原意是医保分段计算、累加支付算法,我只是借用税率的例子
 
延伸的部分看不明白,怎么费用从2100往上无限延伸??
 
to creation-zy:
你可以理解为:某月的工资分两次发放,其中上半月发了2100,下半月了发了5000,需要计算下半月5000需要缴纳的个税
 
如果不取巧,用笨办法,大可以如此计算: CalTax(5000+2100) - CalTax(2100) [:)]
 
要实现无限延伸,你需要定义一个基础库
类别 低值 高值 基数 系数
A 2100 3000 900 0.05
B 3000 5000 2000 0.10
C 5000 10000 2100 8.15
......
然后在程序中根据实际工资金额,判断在基础库中的类即可,我以前帮别人做这种程序的时候,就是这么做的。
 
to creation-zy:
我也想过用这种办法,但是我不仅需要结果,还需要记录过程
即 2000~ 3000段 = 900*0.05
3000~ 5000段 = 2000*0.10
5000~10000段 = 2100*0.15
用 CalTax(5000+2100) - CalTax(2100) 的方法记录计算过程不太方便,而且现在【延伸一】只是最简单的“延伸”,实际的情况比较复杂。
 
什么都用递归,我真是服了 ,
for 1 to 分段数
tax := 余下没有征的 x 率

sum := sum + tax

over.
 
select iif( iif iif) from.....
这个最简单了
 
**************************
【延伸一】 用2楼的方法延伸
**************************
function CalTax( Money, Sum: Double
StartLevel: Byte=0): Double;
sum为累计(本次起点,非起征点),例: Money=5000
sum=2100
算法为: 2100~ 3000: 900*0.05
3000~ 5000: 2000*0.10
5000~10000: 2100*0.15
 
分步显示计算过程,可以在CalTax内部进行相减,原来的参数为Money+Level,计算结果
为Result,那么改成Money0+Money1+Level,计算结果为Result0及Result1,将两者相减即
可得到最终结果。
 
我还是先抛出【延伸二】:申明一下,本帖的原形并非计算“个税”,而是医保的“分段计算、累加支付”,这里只是借用计算个税的“分段计算”的思路
function CalTax( Money, Sum1, Sum2: Double
StartLevel: Byte=0): Double;
Sum1:已发金额(税前)
Sum2:已发金额(税后),该金额并不一定是通过上面的公式计算得出的,比如一次性收入
同时将上面的分段的含义进行微调:5000改为税后金额(其它各段含义不变),即3000~5000税前金额并非是2000(同理5000~10000段中税前金额也非5000),有点绕,不知道有没有描述清楚,做过医保的应该知道怎么回事。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部