用double 会存在小数点精度问题,可以用BigDecimal
package com.xfktech.erp.test;
import java.math.BigDecimal;
/**
* @author liuming
* @email ming.liu@xfktech.com
* @date 2018/8/10
*/
public class TestTax {
public static void main(String[] args) {
System.out.println(getSalaryTax(BigDecimal.valueOf(3801),BigDecimal.valueOf(300)));
}
/**
* 返回个人所得税
* @param salaryBeforeTaxTax 工资收入金额
* @param socialFee 各项社会保险费(三金)
* @return
*/
public static BigDecimal getSalaryTax(BigDecimal salaryBeforeTaxTax, BigDecimal socialFee) {
// 应纳税所得额 = 工资收入金额 - 各项社会保险费 - 起征点(3500元)
// 应纳税额 = 应纳税所得额 x 税率 - 速算扣除数
// 说明:如果计算的是外籍人士(包括港、澳、台),则个税起征点应设为4800元。
BigDecimal taxbase = salaryBeforeTaxTax.subtract(socialFee).subtract(BigDecimal.valueOf(3500));
int taxrate = 0;//这里税率没有除以百分比;
int quickdeduction = 0;
if (taxbase.compareTo(BigDecimal.ZERO) <= 0)//低于个税起征点
{
return BigDecimal.ZERO;
} else if (taxbase.compareTo(BigDecimal.valueOf(1500)) <= 0) {
taxrate = 3;
quickdeduction = 0;
} else if (taxbase.compareTo(BigDecimal.valueOf(4500)) <= 0) {
taxrate = 10;
quickdeduction = 105;
} else if (taxbase.compareTo(BigDecimal.valueOf(9000)) <= 0) {
taxrate = 20;
quickdeduction = 555;
} else if (taxbase.compareTo(BigDecimal.valueOf(35000)) <= 0) {
taxrate = 25;
quickdeduction = 1005;
} else if (taxbase.compareTo(BigDecimal.valueOf(55000)) <= 0) {
taxrate = 30;
quickdeduction = 2755;
} else if (taxbase.compareTo(BigDecimal.valueOf(80000)) <= 0) {
taxrate = 35;
quickdeduction = 5505;
} else {
taxrate = 45;
quickdeduction = 13505;
}
BigDecimal t = BigDecimal.valueOf(taxrate).divide(BigDecimal.valueOf(100)); //除100
BigDecimal re = taxbase.multiply(t).subtract(BigDecimal.valueOf(quickdeduction)) ;
return re.setScale(2,BigDecimal.ROUND_HALF_UP);
}
}