Java Swing 个人所得税计算工具
这是一个基于 Java Swing 开发的个人所得税计算模拟器,模拟了官方个税 APP 的核心功能。项目包含完整的图形界面和核心计算逻辑,适合 Java 初学者理解 Swing 框架应用及税务计算业务逻辑。
核心功能
- 综合所得年度汇算:支持输入年收入、专项扣除等信息进行计算
- 税率表查询:内置 2023 年最新个税税率表
- 专项扣除设置:提供养老、医疗、住房等常见扣除项参考
- 结果展示:实时显示应纳税额、税后收入及月度估算
核心算法与精度处理
在涉及金额计算时,浮点数精度问题必须重视。这里我们使用 BigDecimal 来确保财务数据的准确性,避免 double 类型可能带来的误差。
package com.tax.calculator;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;
/**
* 个人所得税计算器
* 实现 2023 年最新个税计算规则
*/
public class TaxCalculator {
// 税率表(年度综合所得)
private static final TaxBracket[] TAX_BRACKETS = {
new TaxBracket(0, 36000, 0.03, 0),
new TaxBracket(36000, 144000, 0.10, 2520),
new TaxBracket(144000, 300000, 0.20, 16920),
new TaxBracket(300000, 420000, 0.25, 31920),
(, , , ),
(, , , ),
(, Double.MAX_VALUE, , )
};
Map<String, BigDecimal> SPECIAL_DEDUCTIONS = <>();
{
SPECIAL_DEDUCTIONS.put(, ());
SPECIAL_DEDUCTIONS.put(, ());
SPECIAL_DEDUCTIONS.put(, ());
SPECIAL_DEDUCTIONS.put(, ());
SPECIAL_DEDUCTIONS.put(, ());
SPECIAL_DEDUCTIONS.put(, ());
SPECIAL_DEDUCTIONS.put(, ());
SPECIAL_DEDUCTIONS.put(, ());
SPECIAL_DEDUCTIONS.put(, ());
SPECIAL_DEDUCTIONS.put(, ());
}
TaxResult {
;
BigDecimal.valueOf(annualIncome);
BigDecimal.valueOf(specialDeductions);
BigDecimal.valueOf(additionalDeductions);
BigDecimal.valueOf(BASIC_DEDUCTION);
income
.subtract(special)
.subtract(additional)
.subtract(basic)
.max(BigDecimal.ZERO);
findTaxBracket(taxableIncome.doubleValue());
taxableIncome
.multiply(BigDecimal.valueOf(bracket.getRate()))
.subtract(BigDecimal.valueOf(bracket.getQuickDeduction()));
taxAmount = taxAmount.max(BigDecimal.ZERO);
income.subtract(taxAmount);
(
income.doubleValue(),
taxableIncome.doubleValue(),
taxAmount.doubleValue(),
afterTaxIncome.doubleValue(),
bracket
);
}
TaxBracket {
(TaxBracket bracket : TAX_BRACKETS) {
(taxableIncome >= bracket.getLowerBound() &&
taxableIncome < bracket.getUpperBound()) {
bracket;
}
}
TAX_BRACKETS[TAX_BRACKETS.length - ];
}
Map<String, BigDecimal> {
<>(SPECIAL_DEDUCTIONS);
}
{
lowerBound;
upperBound;
rate;
quickDeduction;
{
.lowerBound = lowerBound;
.upperBound = upperBound;
.rate = rate;
.quickDeduction = quickDeduction;
}
{ lowerBound; }
{ upperBound; }
{ rate; }
{ quickDeduction; }
String {
String.format(, rate * , quickDeduction);
}
}
{
totalIncome;
taxableIncome;
taxAmount;
afterTaxIncome;
TaxBracket taxBracket;
{
.totalIncome = totalIncome;
.taxableIncome = taxableIncome;
.taxAmount = taxAmount;
.afterTaxIncome = afterTaxIncome;
.taxBracket = taxBracket;
}
{ totalIncome; }
{ taxableIncome; }
{ taxAmount; }
{ afterTaxIncome; }
TaxBracket { taxBracket; }
String {
String.format(
+
+
+
+
+
,
totalIncome, taxableIncome, taxAmount, afterTaxIncome, taxBracket
);
}
}
}


