sinake
4 天以前 ee089a8ac4a9d99ef0a0491bbf1d80a2d4fbc393
ruoyi-common/src/main/java/com/ruoyi/common/tax/TaxtUtils.java
@@ -5,17 +5,20 @@
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import lombok.extern.slf4j.Slf4j;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.Collection;
import java.util.List;
/**
 * 劳务报酬个税计算规则 (可能不答公共用法,用前先看看是否适合)
 * 劳务报酬个税计算规则 (可能不适合公共用法,用前先看看是否适合)
 *
 * @author ls
 */
@Slf4j
public class TaxtUtils {
    /**
     * 分隔符
@@ -29,76 +32,89 @@
     */
    public static String getTaxation(BigDecimal money) {
        //当X<=800时,个税T=0
        BigDecimal taxMoney = new BigDecimal(0.0);
        BigDecimal taxMoney = BigDecimal.valueOf(0.0);
        //当800<X<=4000时,个税T=(X-800)*20%
        if (money.doubleValue() > 800 && money.doubleValue() <= 4000) {
            BigDecimal subtract = money.subtract(new BigDecimal(800));
            taxMoney = subtract.multiply(new BigDecimal(0.2));
            taxMoney = subtract.multiply(BigDecimal.valueOf(0.2));
        }
        BigDecimal multiply = money.multiply(new BigDecimal(0.8));
        BigDecimal multiply = money.multiply(BigDecimal.valueOf(0.8));
        // 当X>4000时
        //(1)当X*(1-20%)<=20000时,个税T=X*(1-20%)*20%
        if (money.doubleValue() > 4000 && multiply.doubleValue() <= 20000) {
            taxMoney = multiply.multiply(new BigDecimal(0.2));
            taxMoney = multiply.multiply(BigDecimal.valueOf(0.2));
        }
        //(2)当20000<X*(1-20%)<=50000时,个税T=X*(1-20%)*30%-2000
        if (multiply.doubleValue() > 20000 && multiply.doubleValue() <= 50000) {
            taxMoney = multiply.multiply(new BigDecimal(0.3)).subtract(new BigDecimal(2000));
            taxMoney = multiply.multiply(BigDecimal.valueOf(0.3)).subtract(BigDecimal.valueOf(2000));
        }
        //X*(1-20%)>50000时,个税T=X*(1-20%)*40%-7000
        if (multiply.doubleValue() > 50000) {
            taxMoney = multiply.multiply(new BigDecimal(0.4)).subtract(new BigDecimal(7000));
            taxMoney = multiply.multiply(BigDecimal.valueOf(0.4)).subtract(BigDecimal.valueOf(7000));
        }
        DecimalFormat decimalFormat = new DecimalFormat("#.00");
        DecimalFormat decimalFormat = new DecimalFormat("#0.00");
        //进一法
        decimalFormat.setRoundingMode(RoundingMode.CEILING);
        String format = decimalFormat.format(taxMoney);
        log.info("税金为:{}", format);
        return format;
    }
    /**
     * 通过税后工资,算出税前工资
     * <p>
     * 注意:除数必须用字符串/常量构造的精确值。原先写成 {@code new BigDecimal(0.84)} 等,
     * 会把 double 的二进制误差带进除法(如 8313.06 / 0.84 变成 9896.500000…001),
     * 再叠加向上取整就多出 1 分钱,导致“税后反算税前”无法还原(8300.00 类金额反解出 10000.03)。
     *
     * @param money
     * @return
     */
    public static String getTaxationBefore(BigDecimal money) {
        //当X<=800时,个税T=0
        BigDecimal taxMoney = new BigDecimal(0.0);
        BigDecimal taxMoney = BigDecimal.valueOf(0.00);
        if (money.doubleValue() <= 800) {
            taxMoney = money;
        }
//第一个参数是除数,第二个参数代表保留几位小数,第三个代表的是使用的模式
        if (money.doubleValue() > 800 && money.doubleValue() <= 3360) {
            taxMoney =  money.subtract(new BigDecimal(160)).divide(new BigDecimal(0.8),2,BigDecimal.ROUND_UP);
            taxMoney = money.subtract(new BigDecimal(160)).divide(new BigDecimal("0.8"), 2, BigDecimal.ROUND_CEILING);
        }
        if (money.doubleValue() > 3360 && money.doubleValue() <= 21000) {
            taxMoney = money.divide(new BigDecimal(0.84),2,BigDecimal.ROUND_DOWN);
            taxMoney = money.divide(new BigDecimal("0.84"), 2, BigDecimal.ROUND_CEILING);
        }
        if (money.doubleValue() > 21000 && money.doubleValue() <= 40000) {
        if (money.doubleValue() > 21000 && money.doubleValue() <= 49500) {
            money = money.subtract(new BigDecimal(2000));
            taxMoney = money.divide(new BigDecimal(0.76),2,BigDecimal.ROUND_DOWN);
            taxMoney = money.divide(new BigDecimal("0.76"), 2, BigDecimal.ROUND_CEILING);
        }
        if (money.doubleValue() > 40000) {
        if (money.doubleValue() > 49500) {
            money = money.subtract(new BigDecimal(7000));
            taxMoney = money.divide(new BigDecimal(0.68),2,BigDecimal.ROUND_DOWN);
            taxMoney = money.divide(new BigDecimal("0.68"), 2, BigDecimal.ROUND_CEILING);
        }
        DecimalFormat decimalFormat = new DecimalFormat("#.00");
        DecimalFormat decimalFormat = new DecimalFormat("#0.00");
        //进一法
        decimalFormat.setRoundingMode(RoundingMode.CEILING);
        String format = decimalFormat.format(taxMoney);
        log.info("税前金额为:{}", format);
        return format;
    }
    public static void main(String[] args) {
        String taxation = getTaxation(new BigDecimal(21000));
        String taxationBefore = getTaxationBefore(new BigDecimal(52000));
        String taxation = getTaxation(BigDecimal.valueOf(43000));
        String taxationBefore = getTaxationBefore(BigDecimal.valueOf(205892.36));
        System.out.println(taxation + "        " + taxationBefore);
        System.out.println("taxation:" + taxation + "============taxationBefore: " + taxationBefore);
    }
}