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 (nonatomicassignCGFloat personProvidentFundScale;//公积金比例

@property (nonatomicassignCGFloat personYanglaoScale;//养老比例

@property (nonatomicassignCGFloat personMedicalTreatmentScale;//医疗比例

@property (nonatomicassignCGFloat personUnemploymentScale;//失业比例

@property (nonatomicassignCGFloat personOccupationalInjuryScale;//工伤比例

@property (nonatomicassignCGFloat personGiveBirthScale;//生育比例


//公司

@property (nonatomicassignCGFloat companyProvidentFundScale;//公积金比例

@property (nonatomicassignCGFloat companyYanglaoScale;//养老比例

@property (nonatomicassignCGFloat companyMedicalTreatmentScale;//医疗比例

@property (nonatomicassignCGFloat companyUnemploymentScale;//失业比例

@property (nonatomicassignCGFloat companyOccupationalInjuryScale;//工伤比例

@property (nonatomicassignCGFloat companyGiveBirthScale;//生育比例


@property (nonatomicassignCGFloat minSocialSecurityCardinalNumber;//最小社保汇缴 上海基数是3902

@property (nonatomicassignCGFloat maxSocialSecurityCardinalNumber;//最大社保汇缴基数 上海是19512


@property (nonatomicassignCGFloat minAccumulationFundCardinalNumber;//公积金汇缴基数 上海是2190

@property (nonatomicassignCGFloat maxAccumulationFundCardinalNumber;//最大公积金汇缴基数 上海是19512


返回结果model参数:

@interface CCCalculatorResultModel:NSObject


@property (nonatomicassignCGFloat taxBefore;//税前总工资

@property (nonatomicassignCGFloat saveSalary;//到手工资

@property (nonatomicassignCGFloat tax;//个税


//个人

@property (nonatomicassignCGFloat personProvidentFund;//公积金金额

@property (nonatomicassignCGFloat personYanglao;//养老金额

@property (nonatomicassignCGFloat personMedicalTreatment;//医疗金额

@property (nonatomicassignCGFloat personUnemployment;//失业金额

@property (nonatomicassignCGFloat personOccupationalInjury;//工伤金额

@property (nonatomicassignCGFloat personGiveBirth;//生育险金额


//公司

@property (nonatomicassignCGFloat companyProvidentFund;//公积金金额

@property (nonatomicassignCGFloat companyYanglao;//养老金额

@property (nonatomicassignCGFloat companyMedicalTreatment;//医疗金额

@property (nonatomicassignCGFloat companyUnemployment;//失业金额

@property (nonatomicassignCGFloat companyOccupationalInjury;//工伤金额

@property (nonatomicassignCGFloat companyGiveBirth;//生育险金额


@end


1、知道税前算税后(公司/个人 五险一金以及到手工资)

//工资计算(税前算税后)

+(CCCalculatorResultModel *)calculatorSalary:(CGFloat)salary taxBase:(CGFloat)taxBase scaleParam:(CCCalculatorParamModel*)scaleParamModel; {

//    taxBase 交税基数 目前是3500

    

    CCCalculatorResultModel *resultModel = [[CCCalculatorResultModel allocinit];

    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;

}

2、给出税后算税前所有工资 (公司/个人 五险一金以及到手工资)

//工资计算(税后算税前)

+(CCCalculatorResultModel *)taxAfterCalculatorSalary:(CGFloat)salary taxBase:(CGFloat)taxBase scaleParam:(CCCalculatorParamModel*)scaleParamModel{

//    taxBase 交税基数 目前是3500

    CCCalculatorResultModel *resultModel = [[CCCalculatorResultModel allocinit];

    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[0floatValue]) {

        //            最小都按最小基数计算

        theSocialSecurityCalculatorMoney = minSocialSecurityCardinalNumber;

        theCalculatorprovidentFundMoney = minAccumulationFundCardinalNumber;

    }

    else if (salary>[resultArray[0floatValue] &&salary<=[resultArray[1floatValue]){

        //            如果社保的最小基数比公积金最小基数 大,则社保按最小基数算,公积金按比例计算(浮点数存储存在误差,所以判断相等需要用两数相减绝对值跟精度比较 1e-1 0.1

        if (fabs([resultArray[1floatValue]-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[1floatValue] &&salary<=[resultArray[2floatValue]){

        //            在中间部分社保公积金都是按比例计算

        theCalculatorprovidentFundMoney = ROUND(needPayTaxesMoney/(1-allScale));

        theSocialSecurityCalculatorMoney = ROUND(needPayTaxesMoney/(1-allScale));

        

    }

    else if (salary>[resultArray[2]floatValue] && salary<=[resultArray[3]floatValue]){

        //            如果公积金的最大基数比社保最大基数  ,则公积金按最大基数计算,社保按比例计算

        if  (fabs([resultArray[2floatValue]-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];


原创粉丝点击