C#版新个税计算

qq_32451953 2019-01-03 07:30:58
加精
北京新的税法出来了,刚闲来无事花了半个小时用C#写了个计算工具,代码贴上,欢迎大家批评指正,互相学些,本人测试人员,非开发人员,所以代码写的烂,勿喷。
一共4个参数 分别是税前薪水,计税基准线,五险扣除数,减免额度(六项减免总计)
算法拆解:
1月份:(30000–5000-4500-2000)×3% = 555元;
2月份:(30000×2-5000×2-4500×2-2000×2)×10% -2520 -555 =625元;
3月份:(30000×3-5000×3-4500×3-2000×3)×10% -2520 -555-625 =1850元

根据前三个月的示例我们可以把计算方式拆分成四个变量求值:
括号内的数值, 预扣率, 速算数,当前累计交税
(30000×3-5000×3-4500×3-2000×3)×10% -2520 -555-625 =1850元
其中累计交税的数值最难算,需要用到递归,其余的都是固定的,比较容易。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TaxTool
{
class Program
{
static void Main(string[] args)
{
if(args.Length != 4)
{
Console.WriteLine("Please input correct argument with below:");
Console.WriteLine("TaxTool.exe [Salaray] [BasicLine] [WuXian] [JianMian]");
}else{
double salary = double.Parse(args[0]);
double basicline = double.Parse(args[1]);
double wuxian = double.Parse(args[2]);
double jianmian = double.Parse(args[3]);

double totalTax = 0;

//double salary = 20000;
//double basicline = 5000;
//double wuxian = 4000;
//double jianmian = 2000;

double Jan = GetTax(1, salary, basicline, wuxian, jianmian);
Console.WriteLine("Jan tax is " + Jan);
double Feb = GetTax(2, salary, basicline, wuxian, jianmian);
Console.WriteLine("Feb tax is " + Feb);
double March = GetTax(3, salary, basicline, wuxian, jianmian);
Console.WriteLine("March tax is " + March);
double April = GetTax(4, salary, basicline, wuxian, jianmian);
Console.WriteLine("April tax is " + April);
double May = GetTax(5, salary, basicline, wuxian, jianmian);
Console.WriteLine("May tax is " + May);
double June = GetTax(6, salary, basicline, wuxian, jianmian);
Console.WriteLine("June tax is " + June);
double July = GetTax(7, salary, basicline, wuxian, jianmian);
Console.WriteLine("July tax is " + July);
double August = GetTax(8, salary, basicline, wuxian, jianmian);
Console.WriteLine("August tax is " + August);
double September = GetTax(9, salary, basicline, wuxian, jianmian);
Console.WriteLine("September tax is " + September);
double Octorber = GetTax(10, salary, basicline, wuxian, jianmian);
Console.WriteLine("Octorber tax is " + Octorber);
double November = GetTax(11, salary, basicline, wuxian, jianmian);
Console.WriteLine("November tax is " + November);
double December = GetTax(12, salary, basicline, wuxian, jianmian);
Console.WriteLine("December tax is " + December);
totalTax = Jan + Feb + March + April + May + June + July + August + September + Octorber + November + December;
Console.WriteLine("====================================");
Console.WriteLine("Total tax is : " + totalTax);

}
}


static double GetTax(int month, double salary, double basicline, double wuxian, double jianmian)
{
double tax = 0;
double history = 0;
if (month == 1)
{
double number1 = GetFirstNumber(month, salary, basicline, wuxian, jianmian);
double rate = GetRate(number1);
double fast = GetFastNumber(number1);

tax = number1 * rate - fast;
}
else
{
double number1 = GetFirstNumber(month, salary, basicline, wuxian, jianmian);
double rate = GetRate(number1);
double fast = GetFastNumber(number1);
int i = 1;
while (i < month)
{
//Console.WriteLine("History is " + history);
history =history + GetTax(i, salary, basicline, wuxian, jianmian);

i++;
}

tax = number1 * rate - fast - history;
}

return tax;
}

static double GetRate(double number)
{
if (number < 36000)
return 0.03;

else if (36000 < number && number < 144000)
return 0.1;

else if (144000 < number && number < 300000)
return 0.2;

else if (300000 < number && number < 420000)
return 0.25;

else if (420000 < number && number < 650000)
return 0.3;

else if (650000 < number && number < 960000)
return 0.35;

else if (960000 < number)
return 0.45;

else return 0.03;
}

static double GetFastNumber(double number)
{
if (number < 36000)
return 0;

else if (36000 < number && number < 144000)
return 2520;

else if (144000 < number && number < 300000)
return 16920;

else if (300000 < number && number < 420000)
return 31920;

else if (420000 < number && number < 650000)
return 52920;

else if (650000 < number && number < 960000)
return 85920;

else if (960000 < number)
return 181920;

else return 0;
}

static double GetFirstNumber(int month, double salary, double basicline, double wuxian, double jianmian)
{
double number = 0;
if (month < 0 || month > 12)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Month must less than 12 and bigger than 0!");
Console.ResetColor();
}
else {
number = salary * month - basicline * month - wuxian * month - jianmian * month;
}

return number;
}
}
}
...全文
36018 117 打赏 收藏 转发到动态 举报
写回复
用AI写文章
117 条回复
切换为时间正序
请发表友善的回复…
发表回复
saacke 2020-12-28
  • 打赏
  • 举报
回复
看见这么多if好有亲切感
…默陌 2019-06-09
  • 打赏
  • 举报
回复
很高端的样子
wilson1966 2019-05-27
  • 打赏
  • 举报
回复
好,注记一下
吴俊亮 2019-05-26
  • 打赏
  • 举报
回复
感谢分享,这个东东太棒了
qq_41210422 2019-05-15
  • 打赏
  • 举报
回复
牛皮 学习学习一下
「已注销」 2019-05-11
  • 打赏
  • 举报
回复
这么多代码脑袋疼
稀客魔 2019-04-22
  • 打赏
  • 举报
回复
学习学习
sinat_22078271 2019-04-19
  • 打赏
  • 举报
回复
谢谢,辛苦了,非常棒!
sinat_22078271 2019-04-19
  • 打赏
  • 举报
回复
谢谢,辛苦了,非常棒!
weixin_44667069 2019-03-02
  • 打赏
  • 举报
回复
太强了,代码这么多。
gaoqd999 2019-02-23
  • 打赏
  • 举报
回复
很好,可以自己计算了
kilolily 2019-02-22
  • 打赏
  • 举报
回复
很不错,必须收藏阿
即便最了然 2019-02-19
  • 打赏
  • 举报
回复
好难 看不懂
qq_41860834 2019-02-17
  • 打赏
  • 举报
回复
a老王 2019-02-15
  • 打赏
  • 举报
回复
H很好不错的思路
muziwen0212 2019-02-14
  • 打赏
  • 举报
回复
不错不错,路过看看不错不错,路过看看,收藏
niony1981 2019-02-01
  • 打赏
  • 举报
回复
相当不错哦,学习了
SSimon 2019-01-31
  • 打赏
  • 举报
回复
牛人,试试看
xiaogang00001 2019-01-30
  • 打赏
  • 举报
回复
楼主牛人啊,最终税多少才是王道
kk228 2019-01-29
  • 打赏
  • 举报
回复
楼主真是个人才????????????????
加载更多回复(97)

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧