iOS 税前税后的工资计算
来源:互联网 发布:格拉斯是一个软件么 编辑:程序博客网 时间:2024/04/28 03:05
税前税后的工资计算公式如下:
计算个税 =ROUND(MAX((计税工资-3500)*{3;10;20;25;30;35;45}%-5*{0;21;111;201;551;1101;2701},0),2)
倒推税前=ROUND(MAX((实发-3500-{0,105,555,1005,2755,5505,13505})/(1-{3,10,20,25,30,35,45}%)+3500,实发)+SUM(扣除的几险几金),2)
结合公式计算工资个税及五险一金:
给出计算参数model:
@interface CCCalculatorParamModel : NSObject
//个人
@property (nonatomic, assign) CGFloat personProvidentFundScale;//公积金比例
@property (nonatomic, assign) CGFloat personYanglaoScale;//养老比例
@property (nonatomic, assign) CGFloat personMedicalTreatmentScale;//医疗比例
@property (nonatomic, assign) CGFloat personUnemploymentScale;//失业比例
@property (nonatomic, assign) CGFloat personOccupationalInjuryScale;//工伤比例
@property (nonatomic, assign) CGFloat personGiveBirthScale;//生育比例
//公司
@property (nonatomic, assign) CGFloat companyProvidentFundScale;//公积金比例
@property (nonatomic, assign) CGFloat companyYanglaoScale;//养老比例
@property (nonatomic, assign) CGFloat companyMedicalTreatmentScale;//医疗比例
@property (nonatomic, assign) CGFloat companyUnemploymentScale;//失业比例
@property (nonatomic, assign) CGFloat companyOccupationalInjuryScale;//工伤比例
@property (nonatomic, assign) CGFloat companyGiveBirthScale;//生育比例
@property (nonatomic, assign) CGFloat minSocialSecurityCardinalNumber;//最小社保汇缴 上海基数是3902元
@property (nonatomic, assign) CGFloat maxSocialSecurityCardinalNumber;//最大社保汇缴基数 上海是19512元
@property (nonatomic, assign) CGFloat minAccumulationFundCardinalNumber;//公积金汇缴基数 上海是2190元
@property (nonatomic, assign) CGFloat maxAccumulationFundCardinalNumber;//最大公积金汇缴基数 上海是19512元
返回结果model参数:
@interface CCCalculatorResultModel:NSObject
@property (nonatomic, assign) CGFloat taxBefore;//税前总工资
@property (nonatomic, assign) CGFloat saveSalary;//到手工资
@property (nonatomic, assign) CGFloat tax;//个税
//个人
@property (nonatomic, assign) CGFloat personProvidentFund;//公积金金额
@property (nonatomic, assign) CGFloat personYanglao;//养老金额
@property (nonatomic, assign) CGFloat personMedicalTreatment;//医疗金额
@property (nonatomic, assign) CGFloat personUnemployment;//失业金额
@property (nonatomic, assign) CGFloat personOccupationalInjury;//工伤金额
@property (nonatomic, assign) CGFloat personGiveBirth;//生育险金额
//公司
@property (nonatomic, assign) CGFloat companyProvidentFund;//公积金金额
@property (nonatomic, assign) CGFloat companyYanglao;//养老金额
@property (nonatomic, assign) CGFloat companyMedicalTreatment;//医疗金额
@property (nonatomic, assign) CGFloat companyUnemployment;//失业金额
@property (nonatomic, assign) CGFloat companyOccupationalInjury;//工伤金额
@property (nonatomic, assign) CGFloat companyGiveBirth;//生育险金额
@end
1、知道税前算税后(公司/个人 五险一金以及到手工资)
//工资计算(税前算税后)
+(CCCalculatorResultModel *)calculatorSalary:(CGFloat)salary taxBase:(CGFloat)taxBase scaleParam:(CCCalculatorParamModel*)scaleParamModel; {
// taxBase 交税基数 目前是3500
CCCalculatorResultModel *resultModel = [[CCCalculatorResultModel alloc] init];
NSArray *scaleArr = @[@"0.03",@"0.1",@"0.2",@"0.25",@"0.30",@"0.35",@"0.45"];
NSArray *quickDeductionArr = @[@"0",@"105",@"555",@"1005",@"2755",@"5505",@"13505"];
// 社保最小缴纳基数
CGFloat minSocialSecurityCardinalNumber = scaleParamModel.minSocialSecurityCardinalNumber;
// 社保最大缴纳基数
CGFloat maxSocialSecurityCardinalNumber = scaleParamModel.maxSocialSecurityCardinalNumber;
// 公积金最小缴纳基数
CGFloat minAccumulationFundCardinalNumber = scaleParamModel.minAccumulationFundCardinalNumber;
// 公积金最大缴纳基数
CGFloat maxAccumulationFundCardinalNumber = scaleParamModel.maxAccumulationFundCardinalNumber;
// 计算所给工资的社保缴纳基数
CGFloat theCalculatorMoney =0;
if (salary>minSocialSecurityCardinalNumber && salary<=maxSocialSecurityCardinalNumber) {
theCalculatorMoney = salary;
}
else if (salary>maxSocialSecurityCardinalNumber){
theCalculatorMoney = maxSocialSecurityCardinalNumber;
}
else{
theCalculatorMoney = minSocialSecurityCardinalNumber;
}
// 计算社保
CGFloat personYanglao = ROUND(theCalculatorMoney *scaleParamModel.personYanglaoScale);
CGFloat companyYanglao = ROUND(theCalculatorMoney *scaleParamModel.companyYanglaoScale);
resultModel.personYanglao = personYanglao;
resultModel.companyYanglao = companyYanglao;
CGFloat personMedicalTreatment = ROUND(theCalculatorMoney *scaleParamModel.personMedicalTreatmentScale);
CGFloat companyMedicalTreatment = ROUND(theCalculatorMoney *scaleParamModel.companyMedicalTreatmentScale);
resultModel.personMedicalTreatment = personMedicalTreatment;
resultModel.companyMedicalTreatment = companyMedicalTreatment;
CGFloat personUnemployment = ROUND(theCalculatorMoney *scaleParamModel.personUnemploymentScale);
CGFloat companyUnemployment = ROUND(theCalculatorMoney *scaleParamModel.companyUnemploymentScale);
resultModel.personUnemployment = personMedicalTreatment;
resultModel.companyUnemployment = companyUnemployment;
CGFloat personOccupationalInjury = ROUND(theCalculatorMoney *scaleParamModel.personOccupationalInjuryScale);
CGFloat companyOccupationalInjury = ROUND(theCalculatorMoney *scaleParamModel.companyOccupationalInjuryScale);
resultModel.personOccupationalInjury = personOccupationalInjury;
resultModel.companyOccupationalInjury = companyOccupationalInjury;
CGFloat personGiveBirth = ROUND(theCalculatorMoney *scaleParamModel.personGiveBirthScale);
CGFloat companyGiveBirth = ROUND(theCalculatorMoney *scaleParamModel.companyGiveBirthScale);
resultModel.personGiveBirth = personGiveBirth;
resultModel.companyGiveBirth = companyGiveBirth;
// 计算所给工资的公积金缴纳基数
CGFloat theCalculatorprovidentFundMoney =0;
if (salary > minAccumulationFundCardinalNumber && salary <= maxAccumulationFundCardinalNumber) {
theCalculatorprovidentFundMoney = salary;
}else if (salary > maxAccumulationFundCardinalNumber){
theCalculatorprovidentFundMoney = maxAccumulationFundCardinalNumber;
}else{
theCalculatorprovidentFundMoney = minAccumulationFundCardinalNumber;
}
// 计算公积金
CGFloat personProvidentFund = ROUND(theCalculatorprovidentFundMoney *scaleParamModel.personProvidentFundScale);
CGFloat companyProvidentFund = ROUND(theCalculatorprovidentFundMoney *scaleParamModel.companyProvidentFundScale);
resultModel.personProvidentFund = personProvidentFund;
resultModel.companyProvidentFund = companyProvidentFund;
// 需要交税的工资
CGFloat needPayTaxesMoney = salary-(personProvidentFund+personYanglao+personUnemployment+personGiveBirth+personOccupationalInjury+personMedicalTreatment);
// 计算个税
CGFloat needPayTaxes = salary-(personProvidentFund+personYanglao+personUnemployment+personGiveBirth+personOccupationalInjury+personMedicalTreatment)-taxBase;
NSMutableArray *taxArr = [NSMutableArray array];
for (int i=0; i<scaleArr.count; i++) {
CGFloat scale = [scaleArr[i] floatValue];
CGFloat tax = needPayTaxes *scale -[quickDeductionArr[i] integerValue];
[taxArr addObject:[NSNumber numberWithFloat:tax]];
}
[taxArr addObject:[NSNumber numberWithInt:0]];
CGFloat maxValue = [[taxArr valueForKeyPath:@"@max.floatValue"] floatValue];
CGFloat tax = ROUND(maxValue);
resultModel.tax = tax;
//到手工资
CGFloat saveSalary = needPayTaxesMoney -tax;
resultModel.saveSalary = saveSalary;
return resultModel;
}
//工资计算(税后算税前)
+(CCCalculatorResultModel *)taxAfterCalculatorSalary:(CGFloat)salary taxBase:(CGFloat)taxBase scaleParam:(CCCalculatorParamModel*)scaleParamModel{
// taxBase 交税基数 目前是3500
CCCalculatorResultModel *resultModel = [[CCCalculatorResultModel alloc] init];
NSArray *scaleArr = @[@"0.03",@"0.1",@"0.2",@"0.25",@"0.30",@"0.35",@"0.45"];
NSArray *quickDeductionArr = @[@"0",@"105",@"555",@"1005",@"2755",@"5505",@"13505"];
// 社保最小缴纳基数
CGFloat minSocialSecurityCardinalNumber = scaleParamModel.minSocialSecurityCardinalNumber;
// 社保最大缴纳基数
CGFloat maxSocialSecurityCardinalNumber = scaleParamModel.maxSocialSecurityCardinalNumber;
// 公积金最小缴纳基数
CGFloat minAccumulationFundCardinalNumber = scaleParamModel.minAccumulationFundCardinalNumber;
// 公积金最大缴纳基数
CGFloat maxAccumulationFundCardinalNumber = scaleParamModel.maxAccumulationFundCardinalNumber;
// 税后最小最大基数(五险)
CCCalculatorResultModel *minSocialSalarModel = [self calculatorSalary:minSocialSecurityCardinalNumber taxBase:taxBase scaleParam:scaleParamModel];
CGFloat minSocialSecurity = minSocialSalarModel.personGiveBirth+minSocialSalarModel.personOccupationalInjury+minSocialSalarModel.personMedicalTreatment+minSocialSalarModel.personYanglao+minSocialSalarModel.personUnemployment; //五险最低缴纳额
CCCalculatorResultModel *maxSocialSalarModel = [self calculatorSalary:maxSocialSecurityCardinalNumber taxBase:taxBase scaleParam:scaleParamModel];
// 税后最小最大基数(公积金)
CCCalculatorResultModel *minFourFundSalarModel = [self calculatorSalary:minAccumulationFundCardinalNumber taxBase:taxBase scaleParam:scaleParamModel];
CCCalculatorResultModel *maxFourFundSalarModel = [self calculatorSalary:maxAccumulationFundCardinalNumber taxBase:taxBase scaleParam:scaleParamModel];
CGFloat minFourFund = minFourFundSalarModel.personProvidentFund; //公积金最低缴纳额
// 税后最小最大基数到手工资(五险一金)
CGFloat minTaxAfterSocialSecurityCardinalNumber = minSocialSalarModel.saveSalary;
CGFloat maxTaxAfterSocialSecurityCardinalNumber = maxSocialSalarModel.saveSalary;
CGFloat minTaxAfterAccumulationFundCardinalNumber = minFourFundSalarModel.saveSalary;
CGFloat maxTaxAfterAccumulationFundCardinalNumber = maxFourFundSalarModel.saveSalary;
CGFloat theSocialSecurityCalculatorMoney = 0;//社保计算基数
CGFloat theCalculatorprovidentFundMoney = 0;//公积金计算基数
//社保比例和
CGFloat allSocialScale = scaleParamModel.personYanglaoScale+scaleParamModel.personMedicalTreatmentScale+scaleParamModel.personOccupationalInjuryScale+scaleParamModel.personGiveBirthScale+scaleParamModel.personUnemploymentScale;
//所有比例和
CGFloat allScale = scaleParamModel.personProvidentFundScale +scaleParamModel.personYanglaoScale+scaleParamModel.personMedicalTreatmentScale+scaleParamModel.personOccupationalInjuryScale+scaleParamModel.personGiveBirthScale+scaleParamModel.personUnemploymentScale;
// 个税推税前
CGFloat baseMoney = salary-taxBase;
NSMutableArray *allMoneyArr = [NSMutableArray array];
for (int i=0; i<scaleArr.count; i++) {
CGFloat scale = [scaleArr[i] floatValue];
CGFloat money = baseMoney -[quickDeductionArr[i] integerValue];
CGFloat needPayTaxes = money/(1-scale);
[allMoneyArr addObject:[NSNumber numberWithFloat:needPayTaxes+taxBase]];
}
[allMoneyArr addObject:[NSNumber numberWithFloat:salary]];
CGFloat maxAllMoneyValue = [[allMoneyArr valueForKeyPath:@"@max.floatValue"] floatValue];
CGFloat needPayTaxesMoney = ROUND(maxAllMoneyValue);
// 计算五险一金 (税后 最小最大基数排序)
NSArray *numberArr = @[@(minTaxAfterAccumulationFundCardinalNumber),@(minTaxAfterSocialSecurityCardinalNumber),@(maxTaxAfterAccumulationFundCardinalNumber),@(maxTaxAfterSocialSecurityCardinalNumber)];
NSComparator finderSort = ^(id string1,id string2){
if ([string1 integerValue] > [string2 integerValue]) {
return (NSComparisonResult)NSOrderedDescending;
}else if ([string1 integerValue] < [string2 integerValue]){
return (NSComparisonResult)NSOrderedAscending;
}
else
return (NSComparisonResult)NSOrderedSame;
};
NSArray *resultArray = [numberArr sortedArrayUsingComparator:finderSort];
// 计算社保公积金的缴纳基数
if (salary <= [resultArray[0] floatValue]) {
// 最小都按最小基数计算
theSocialSecurityCalculatorMoney = minSocialSecurityCardinalNumber;
theCalculatorprovidentFundMoney = minAccumulationFundCardinalNumber;
}
else if (salary>[resultArray[0] floatValue] &&salary<=[resultArray[1] floatValue]){
// 如果社保的最小基数比公积金最小基数 大,则社保按最小基数算,公积金按比例计算(浮点数存储存在误差,所以判断相等需要用两数相减绝对值跟精度比较 1e-1 是0.1)
if (fabs([resultArray[1] floatValue]-minTaxAfterSocialSecurityCardinalNumber)<=1e-1) {
theSocialSecurityCalculatorMoney = minSocialSecurityCardinalNumber;
theCalculatorprovidentFundMoney = ROUND((needPayTaxesMoney + minSocialSecurity) /(1-scaleParamModel.personProvidentFundScale));
}
else{
// 如果社保的最小基数比公积金最小基数 小,则公积金按最小基数算,社保按比例计算
theSocialSecurityCalculatorMoney = ROUND((needPayTaxesMoney+minFourFund)/(1-allSocialScale));
theCalculatorprovidentFundMoney = minAccumulationFundCardinalNumber;
}
}
else if (salary>[resultArray[1] floatValue] &&salary<=[resultArray[2] floatValue]){
// 在中间部分社保公积金都是按比例计算
theCalculatorprovidentFundMoney = ROUND(needPayTaxesMoney/(1-allScale));
theSocialSecurityCalculatorMoney = ROUND(needPayTaxesMoney/(1-allScale));
}
else if (salary>[resultArray[2]floatValue] && salary<=[resultArray[3]floatValue]){
// 如果公积金的最大基数比社保最大基数 小 ,则公积金按最大基数计算,社保按比例计算
if (fabs([resultArray[2] floatValue]-maxTaxAfterAccumulationFundCardinalNumber)<=1e-1) {
theSocialSecurityCalculatorMoney = ROUND(needPayTaxesMoney/(1-allScale));
theCalculatorprovidentFundMoney = maxAccumulationFundCardinalNumber;
}
else{
// 如果公积金的最大基数比社保最大基数 大 ,则社保按最大基数计算,公积金按比例计算
theCalculatorprovidentFundMoney = ROUND(needPayTaxesMoney/(1-allScale));
theSocialSecurityCalculatorMoney = maxSocialSecurityCardinalNumber;
}
}
else{
// 都超过最大,则都按最大基数计算
theSocialSecurityCalculatorMoney = maxSocialSecurityCardinalNumber;
theCalculatorprovidentFundMoney = maxAccumulationFundCardinalNumber;
}
// 计算个税
NSMutableArray *taxArr = [NSMutableArray array];
// 计算个税
CGFloat needPayTaxes = needPayTaxesMoney-taxBase;
for (int i=0; i<scaleArr.count; i++) {
CGFloat scale = [scaleArr[i] floatValue];
CGFloat tax = needPayTaxes*scale -[quickDeductionArr[i] integerValue];
[taxArr addObject:[NSNumber numberWithFloat:tax]];
}
[taxArr addObject:[NSNumber numberWithInt:0]];
CGFloat maxValue = [[taxArr valueForKeyPath:@"@max.floatValue"] floatValue];
CGFloat tax = ROUND(maxValue);
resultModel.tax = tax;
// 计算五险
CGFloat personYanglao = ROUND(theSocialSecurityCalculatorMoney * scaleParamModel.personYanglaoScale);
CGFloat companyYanglao = ROUND(theSocialSecurityCalculatorMoney * scaleParamModel.companyYanglaoScale);
resultModel.personYanglao = personYanglao;
resultModel.companyYanglao = companyYanglao;
CGFloat personMedicalTreatment = ROUND(theSocialSecurityCalculatorMoney * scaleParamModel.personMedicalTreatmentScale);
CGFloat companyMedicalTreatment = ROUND(theSocialSecurityCalculatorMoney * scaleParamModel.companyMedicalTreatmentScale);
resultModel.personMedicalTreatment = personMedicalTreatment;
resultModel.companyMedicalTreatment = companyMedicalTreatment;
CGFloat personUnemployment = ROUND(theSocialSecurityCalculatorMoney * scaleParamModel.personUnemploymentScale);
CGFloat companyUnemployment = ROUND(theSocialSecurityCalculatorMoney * scaleParamModel.companyUnemploymentScale);
resultModel.personUnemployment = personUnemployment;
resultModel.companyUnemployment = companyUnemployment;
CGFloat personOccupationalInjury = ROUND(theSocialSecurityCalculatorMoney * scaleParamModel.personOccupationalInjuryScale);
CGFloat companyOccupationalInjury = ROUND(theSocialSecurityCalculatorMoney * scaleParamModel.companyOccupationalInjuryScale);
resultModel.personOccupationalInjury = personOccupationalInjury;
resultModel.companyOccupationalInjury = companyOccupationalInjury;
CGFloat personGiveBirth = ROUND(theSocialSecurityCalculatorMoney * scaleParamModel.personGiveBirthScale);
CGFloat companyGiveBirth = ROUND(theSocialSecurityCalculatorMoney * scaleParamModel.companyGiveBirthScale);
resultModel.personGiveBirth = personGiveBirth;
resultModel.companyGiveBirth = companyGiveBirth;
// 计算公积金
CGFloat personProvidentFund = ROUND(theCalculatorprovidentFundMoney *scaleParamModel.personProvidentFundScale);
CGFloat companyProvidentFund = ROUND(theCalculatorprovidentFundMoney *scaleParamModel.companyProvidentFundScale);
resultModel.personProvidentFund = personProvidentFund;
resultModel.companyProvidentFund = companyProvidentFund;
// taxBefore 税前
CGFloat taxBefore = needPayTaxesMoney+ (personProvidentFund+personYanglao+personMedicalTreatment+personUnemployment+personOccupationalInjury+personGiveBirth);
resultModel.taxBefore = taxBefore;
return resultModel;
}
CCCalculatorParamModel *paramModel = [[CCCalculatorParamModelalloc] init];
paramModel.personProvidentFundScale =0.07;
paramModel.companyProvidentFundScale =0.07;
paramModel.personMedicalTreatmentScale =0.02;
paramModel.companyMedicalTreatmentScale =0.095;
paramModel.personYanglaoScale =0.08;
paramModel.companyYanglaoScale =0.2;
paramModel.personUnemploymentScale =0.005;
paramModel.companyUnemploymentScale =0.005;
paramModel.personGiveBirthScale =0;
paramModel.companyGiveBirthScale =0.01;
paramModel.personOccupationalInjuryScale =0;
paramModel.companyOccupationalInjuryScale =0.004;
paramModel.minSocialSecurityCardinalNumber =3902;
paramModel.maxSocialSecurityCardinalNumber =19512;
paramModel.minAccumulationFundCardinalNumber =2190;
paramModel.maxAccumulationFundCardinalNumber =19512;
//税前算税后
CCCalculatorResultModel *resultModelTaxBefore = [CCCommoncalculatorSalary:[self.ratefloatValue] taxBase:3500 scaleParam:paramModel];
//税后算税前
CCCalculatorResultModel *resultModelTaxAfter = [CCCommontaxAfterCalculatorSalary:[self.ratefloatValue] taxBase:3500 scaleParam:paramModel];
- iOS 税前税后的工资计算
- 税前税后工资计算小软件
- 已知税后求税前工资
- 新个人所得税EXCEL计算公式以及税后工资反算税前工资公式详解
- 新个人所得税EXCEL计算公式以及税后工资反算税前工资公式
- 2008年上海税前税后工资对照表
- 税前工资,税后能拿多少?请大家仔细看完。
- 税后工资计算小程序
- 北京税后工资计算方式(仅供参考)
- python实现的个人税后工资计算器
- 税收问题的分析:已知税后收入求税前、年终奖"一元陷阱"的分析
- 计算税后收入
- 工资税的计算
- 周工资的计算
- 税后收入计算与四险一金
- 一段计算北京2008年最新税后收入的python代码
- 2010-2011上海市四金及税后工资计算器(最新)
- 计算工资
- IT裸辞后的艰辛道路
- MySQL外键的使用(二)
- spark数据流的合并与分支
- 由lol六周年全新官网按钮动画——动画效果、z-index
- 去除csdn右下角广告
- iOS 税前税后的工资计算
- 电源与地之间的电容作用
- 学习笔记28-关联规则
- python+android自动化测试生成report、发送report邮件
- 使用Tomcat部署虚拟主机
- JavaWeb之DButils(三)使用C3P0实现数据库的连接池
- lnmp一键安装
- 实现MVC: 2. bean加载, IoC依赖注入
- 给某一个类新增加属性