项目概述
这是一个使用 Java Swing 开发的个人所得税计算模拟器,模拟了官方个税 APP 的核心功能。项目特点包括 100% 纯 Java 实现、无第三方依赖、完整的 GUI 界面以及遵循 2023 年最新个税政策。
主要功能涵盖综合所得年度汇算计算、税率表查询、专项扣除项目设置以及税务计算结果展示。适合 Java 学习者和有税务计算需求的朋友参考使用。
核心逻辑与实现
主程序入口
在启动部分,我们利用 SwingUtilities.invokeLater 确保线程安全,并动态设置系统外观。这样做的目的是让界面在不同操作系统上都能保持原生风格。
package com.tax.calculator;
import javax.swing.*;
public class PersonalIncomeTaxApp {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
TaxCalculatorFrame frame = new TaxCalculatorFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
System.out.println("个人所得税计算模拟器启动成功!");
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, "程序启动失败:" + e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
}
});
}
}
个税计算核心类
这里需要特别注意精度问题。涉及金额计算时,直接使用 double 容易产生误差,所以核心计算类中统一使用了 BigDecimal。税率表采用了静态常量数组定义,方便后续维护。
package com.tax.calculator;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;
public class {
TaxBracket[] TAX_BRACKETS = {
(, , , ),
(, , , ),
(, , , ),
(, , , ),
(, , , ),
(, , , ),
(, 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
);
}
}
}


