感受Java魅力——基于Java二维数组和If语句编制的税后工资计算方法
1. 致谢
这是我的第一篇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.