
- 1. 致谢
- 2. 分享的内容与意义
- 3. 本次编程实践要解决的问题
- 4. 实现过程中的挑战与对策
- 5 实现过程
- 6. 一起来互动
- 7. 关于我本人
这是我的第一篇CSDN博客。作为Java小白,首先要感谢达内程序媛泡泡老师的带领:幽默、风趣而又通俗易懂,能够把Java这么一门非常理性的课程讲的这么生动,非常让人敬佩,这让我的Java学习有了一个很好的开始。
2. 分享的内容与意义本次Java实践,借助新个人所得税政策中的薪资计算案例,理解如何使用二维数组、If语句和for循环解决累加型数据计算问题。欢迎各位前辈指导,并愿与伙伴们共同进步。
3. 本次编程实践要解决的问题问题名称:求税后工资问题
2019年1月1日起,国家推出新的个人所得税政策,起征点上调值5000元。也就是说税前工资扣除三险一金(三险一金数额假设是税前工资的10%)后如果不足5000元,则不交税。如果大于5000元,那么大于5000元的部分按梯度交税,具体梯度比例如下: 第1档:0 ~ 3000元的部分,交税3% 第2档:3000 ~ 12000元的部分,交税10% 第3档:12000 ~ 25000的部分,交税20% 第4档:25000 ~ 35000的部分,交税25% 第5档:35000 ~ 55000的部分,交税30% 第6档:55000 ~ 80000的部分,交税35% 第7档:超过80000的部分,交税45% 比如:小蓝入职一家企业后,税前工资是18000,则他每月该交个税的部分是18000-1800-5000=11200元,个税缴纳数额是3000×3%+8200×10%=910元。税后工资15290元。 请完成一个个税计算程序,在用户输入税前工资后,计算出他对应的纳税数额,以及税后工资为多少?4. 实现过程中的挑战与对策
这个问题的解决通常会使用第一种方式,如下文的taxCal1(),通过if语句和单纯的数字运算方式来实现:简单也相对容易实现。但缺点是可延展性弱,如果再增加工资档位,需要另外增加冗长的代码。另外,内部实现依赖手工计算,代码可读性弱。
有哪些机会可以进一步优化程序,以简化我们的工作,减少对手工计算的依赖?待解决的问题中呈现了几个特征:
- 6个档位的工资有着共同的属性,比如都有最低工资、最高工资和税率,所以for循环会有机会
- 6个档位的计算都是在前面的基础上累加起来的,依然通过for循环解决和If判断语句
- 6个档位的工资差距不一样,所以不能是单纯的循环,可能要用到数组。
上述特征带来了构建taxCal2()的计算机会,详情见如下实现过程。
5 实现过程如下代码提供了2种计算方式,第一种是常见的计算方式taxCal1(),第二种是基于问题特征构建的taxCal2().
package ZVC.Varaible;
import java.util.Scanner;
public class TestTax {
public static void main(String[] args) {
System.out.println("请输入您的税前工资(元):");
double s = new Scanner(System.in).nextDouble();
System.out.println("根据第1种计算方式:");
taxCal1(s);
System.out.println("根据第2种计算方式:");
taxCal2(s);
}
public static void taxCal1(double s){
if((s*0.9-5000) < 0){
System.out.println("您的税后工资为:"+(s*0.9));
}else if((s*0.9-5000) <= 3000){
System.out.println("您的税后工资为:"+(s*0.9-(s*0.9-5000)*0.03));
}else if((s*0.9-5000) <= 12000){
System.out.println("您的税后工资为:"+(s*0.9-(s*0.9-8000)*0.1-3000*0.03));
}else if((s*0.9-5000) <= 25000){
System.out.println("您的税后工资为:"+(s*0.9-(s*0.9-17000)*0.2-9000*0.1-3000*0.03));
}else if((s*0.9-5000) <= 35000){
System.out.println("您的税后工资为:"+(s*0.9-(s*0.9-30000)*0.25-13000*0.2-9000*0.1-3000*0.03));
}else if((s*0.9-5000) <= 55000){
System.out.println("您的税后工资为:"+(s*0.9-(s*0.9-40000)*0.3-10000*0.25-13000*0.2-9000*0.1-3000*0.03));
}else if((s*0.9-5000) <= 80000){
System.out.println("您的税后工资为:"+(s*0.9-(s*0.9-60000)*0.35-20000*0.3-10000*0.25-13000*0.2-9000*0.1-3000*0.03));
}else {
System.out.println("您的税后工资为:"+(s*0.9-(s*0.9-85000)*0.45-25000*0.35-20000*0.3-10000*0.25-13000*0.2-9000*0.1-3000*0.03));
}
}
public static void taxCal2(double sBt){
double[][] sc = {{0,3000,12000,25000,35000,55000,80000},{3000,9000,13000,10000,20000,25000,80000},{0.03,0.10,0.20,0.25,0.30,0.35,0.45}};
int n = 0;//初始化档位
while((n (sc[0][n]))){
n=n + 1;
};
double sp = 0;//交税的中间档位(不含最后交税的档位)
double sAt = 0;//税后薪资
if (n==0 || ((sBt*0.9-5000)<=0))
{
sAt = sBt * 0.9; //计算0档位的税后工资
}else if((sBt*0.9-5000)>0) //计算1档位以后的税后工资
{
for (int i = 0; i < n-1; i++)
{
sp = sp + sc[1][i] * sc[2][i];
}
sAt = sBt * 0.9 - sp - (sBt * 0.9 - 5000 - sc[0][n-1]) * sc[2][n-1];
}
System.out.println("所在档位为第" + n + "档。");
System.out.println("您的税后工资为"+sAt+"元");
}
}
6. 一起来互动
以上的代码是我本人对于二位数组使用的初次尝试,不当之处,敬请批评指正。关于本文过程的实现和其中方法的使用,您有些什么样的看法呢?
7. 关于我本人我叫海之归子。我不是海归,起这个名字希望自己能够回归到如大海一般的博大与包容中。我是一名企业管理顾问,从事卓越运营管理咨询,志在支持组织与人突破系统限制,绽放生命光华。我热爱编程,它让我将管理经验模块化,让我有机会更好地去简化人们的工作,帮助人们更好地创造内在和外在价值。
一起共创未来:kevin.yuan@zenithvue.com
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)