问题描述
小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资。假设他一个月的税前工资(扣除五险一金后、未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算:
1) 个人所得税起征点为3500元,若S不超过3500,则不交税,3500元以上的部分才计算个人所得税,令A=S-3500元; 2) A中不超过1500元的部分,税率3%;
3) A中超过1500元未超过4500元的部分,税率10%; 4) A中超过4500元未超过9000元的部分,税率20%; 5)
A中超过9000元未超过35000元的部分,税率25%; 6) A中超过35000元未超过55000元的部分,税率30%; 7)
A中超过55000元未超过80000元的部分,税率35%; 8) A中超过80000元的部分,税率45%;
例如,如果小明的税前工资为10000元,则A=10000-3500=6500元,其中不超过1500元部分应缴税1500×3%=45元,超过1500元不超过4500元部分应缴税(4500-1500)×10%=300元,超过4500元部分应缴税(6500-4500)×20%=400元。总共缴税745元,税后所得为9255元。
已知小明这个月税后所得为T元,请问他的税前工资S是多少元。输入格式
输入的第一行包含一个整数T,表示小明的税后所得。所有评测数据保证小明的税前工资为一个整百的数。
输出格式
输出一个整数S,表示小明的税前工资。
样例输入
9255
样例输出
10000
评测用例规模与约定
对于所有评测用例,1 ≤ T ≤ 100000。
这道题可是坑了我个坑呀,都是自己刚开始就没读清楚题目的要求结果就----白打了好长时间。
- 先是没看清已知与所求,结果自己按照顺序思维蹭蹭往下写,繁杂的计算。
- 再是没看清题目的工资都是整百元
之后就思维混乱的,没啥心思再干了,去百度了下各位大神的做法。我其中借鉴了一位大神的做法,思考了片刻之后终于解决。
借鉴网址:https://blog.csdn.net/sunjinshengli/article/details/78820845
思考过程
这个问题并不复杂。简单分析一下:
工资的计算公式如下:
T = S - tax
其中,T为税后工资,S为税前工资,tax为需缴纳的税款,并且tax与S存在函数关系:
tax = f(S)
这个函数就是一个简单的分段函数:几个节点如下表:
先放代码
package _2_08_工资计算;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt(); //输入之后的工资
double S = 0; //之前的工资
if(T <= 3500)
S = T;
else if(T <=4955){
S = (T-105)/0.97;
}else if(T <=7655){
S = (T-455)/0.9;
}else if(T <=11255){
S = (T-1255)/0.8;
}else if(T <=30755){
S = (T-1880)/0.75;
}else if(T <=44755){
S = (T-3805)/0.7;
}else if(T <=61005){
S = (T-6730)/0.65;
}else{
S = (T-15080)/0.55;
}
System.out.println((int)Math.floor(S+0.5));
}
}
像代码里的 105 455…我刚开始很迷或不知道怎么计算出来的。然后就举了个栗子进行计算。 结果其实就是一个简单的数学问题,然后把 计算式子化简所得。
例如 : T = S -(S-3500)*0.97 化简,反解S即可。
第二个问题 ——Java的精度问题
这个我受那个博主的启发,但又不同于他,我选择了用 +0.5向下取整的方法解决。