个人所得税计算模拟器
给大家分享一个用纯 Java 实现的个人所得税计算模拟器,包含完整的 GUI 界面和核心计算逻辑,适合 Java 学习者和税务计算需求者参考使用。
一、项目简介
这是一个使用 Java Swing 开发的个人所得税计算模拟器,模拟了官方个税 APP 的核心功能,包括:
- 综合所得年度汇算计算
- 税率表查询
- 专项扣除项目设置
- 税务计算结果展示
项目特点
- 100% 纯 Java 实现,无第三方依赖
- 完整 GUI 界面,支持用户交互
- 详细的代码注释
- 遵循 2023 年最新个税政策
二、核心代码实现
1. 主程序入口
package com.tax.calculator;
import javax.swing.*;
/**
* 个人所得税计算模拟器 - 主程序
* @author TaxDeveloper
* @version 1.0
*/
public class PersonalIncomeTaxApp {
public static void main(String[] args) {
// 使用 SwingUtilities 确保线程安全
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);
}
});
}
}
2. 个税计算核心类
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),
new TaxBracket(420000, 660000, 0.30, 52920),
new TaxBracket(660000, 960000, 0.35, 85920),
new TaxBracket(960000, Double.MAX_VALUE, 0.45, )
};
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
);
}
}
}
3. GUI 界面实现
package com.tax.calculator;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.util.Map;
/**
* 个税计算器主界面
*/
public class TaxCalculatorFrame extends JFrame {
private JTextField incomeField;
private JTextField specialDeductionField;
private JTextField additionalDeductionField;
private JTextArea resultArea;
private JComboBox<String> deductionTypeCombo;
private JLabel standardLabel;
public TaxCalculatorFrame() {
initUI();
initData();
}
private void initUI() {
setTitle("个人所得税计算模拟器 v1.0");
setSize(800, 600);
setLocationRelativeTo(null);
// 主面板
JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
// 输入面板
mainPanel.add(createInputPanel(), BorderLayout.NORTH);
mainPanel.add(createResultPanel(), BorderLayout.CENTER);
mainPanel.add(createButtonPanel(), BorderLayout.SOUTH);
add(mainPanel);
}
JPanel {
( (, , , ));
panel.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createLineBorder(Color.GRAY),
,
TitledBorder.LEFT,
TitledBorder.TOP
));
panel.add( ());
incomeField = ();
panel.add(incomeField);
panel.add( ());
specialDeductionField = ();
panel.add(specialDeductionField);
panel.add( ());
additionalDeductionField = ();
panel.add(additionalDeductionField);
panel.add( ());
( (FlowLayout.LEFT));
deductionTypeCombo = <>();
queryPanel.add(deductionTypeCombo);
standardLabel = ();
queryPanel.add(standardLabel);
panel.add(queryPanel);
panel;
}
JScrollPane {
resultArea = ();
resultArea.setEditable();
resultArea.setFont( (, Font.PLAIN, ));
resultArea.setBorder(BorderFactory.createEmptyBorder(, , , ));
(resultArea);
scrollPane.setBorder(BorderFactory.createTitledBorder());
scrollPane;
}
JPanel {
( (FlowLayout.CENTER, , ));
();
calculateBtn.setFont( (, Font.BOLD, ));
calculateBtn.setBackground( (, , ));
calculateBtn.setForeground(Color.WHITE);
calculateBtn.setPreferredSize( (, ));
calculateBtn.addActionListener( () {
{
calculateTax();
}
});
();
clearBtn.setFont( (, Font.PLAIN, ));
clearBtn.setPreferredSize( (, ));
clearBtn.addActionListener(e -> clearResults());
();
rateTableBtn.setFont( (, Font.PLAIN, ));
rateTableBtn.setPreferredSize( (, ));
rateTableBtn.addActionListener(e -> showTaxRateTable());
panel.add(calculateBtn);
panel.add(clearBtn);
panel.add(rateTableBtn);
panel;
}
{
Map<String, BigDecimal> standards = TaxCalculator.getSpecialDeductionStandards();
(String key : standards.keySet()) {
deductionTypeCombo.addItem(key);
}
deductionTypeCombo.addActionListener(e -> {
(String) deductionTypeCombo.getSelectedItem();
(selected != ) {
standards.get(selected);
standardLabel.setText(String.format(, standard));
}
});
(deductionTypeCombo.getItemCount() > ) {
deductionTypeCombo.setSelectedIndex();
}
}
{
{
Double.parseDouble(incomeField.getText());
Double.parseDouble(specialDeductionField.getText());
Double.parseDouble(additionalDeductionField.getText());
(income < || special < || additional < ) {
JOptionPane.showMessageDialog(,
,
,
JOptionPane.WARNING_MESSAGE);
;
}
TaxCalculator. TaxCalculator.calculateAnnualTax(
income, special, additional);
displayResult(result);
} (NumberFormatException ex) {
JOptionPane.showMessageDialog(,
,
,
JOptionPane.ERROR_MESSAGE);
}
}
{
();
sb.append();
sb.append(String.format(, result.getTotalIncome()));
sb.append(String.format(, result.getTaxableIncome()));
sb.append(String.format(, result.getTaxBracket()));
sb.append(String.format(, result.getTaxAmount()));
sb.append(String.format(, result.getAfterTaxIncome()));
result.getTaxAmount() / ;
result.getAfterTaxIncome() / ;
sb.append();
sb.append(String.format(, monthlyTax));
sb.append(String.format(, monthlyAfterTax));
sb.append();
(result.getTaxableIncome() > ) {
sb.append();
sb.append();
sb.append();
} {
sb.append();
}
resultArea.setText(sb.toString());
resultArea.setCaretPosition();
}
{
();
sb.append();
sb.append();
sb.append();
TaxCalculator.TaxBracket[] brackets = .TaxBracket[]{
.TaxBracket(, , , ),
.TaxBracket(, , , ),
.TaxBracket(, , , ),
.TaxBracket(, , , ),
.TaxBracket(, , , ),
.TaxBracket(, , , ),
.TaxBracket(, Double.MAX_VALUE, , )
};
( ; i < brackets.length; i++) {
TaxCalculator. brackets[i];
String range;
(b.getUpperBound() == Double.MAX_VALUE) {
range = String.format(, b.getLowerBound());
} {
range = String.format(,
b.getLowerBound(), b.getUpperBound());
}
sb.append(String.format(,
i + , range, b.getRate() * , b.getQuickDeduction()));
}
sb.append();
resultArea.setText(sb.toString());
}
{
resultArea.setText();
}
}
三、使用说明
1. 运行环境要求
- Java 8 或更高版本
- 支持 Swing 的桌面环境
2. 编译运行
# 编译所有 Java 文件
javac -d . com/tax/calculator/*.java
# 运行程序
java com.tax.calculator.PersonalIncomeTaxApp
3. 程序功能演示
- 输入计算参数:
- 年度总收入
- 三险一金专项扣除
- 专项附加扣除
- 查询扣除标准:
- 通过下拉框选择不同扣除项目
- 查看各项目扣除标准
- 计算个税:
- 点击'计算个税'按钮
- 查看详细计算结果
- 查看税率表:
- 点击'查看税率表'按钮
- 了解各级税率信息
四、核心算法说明
1. 计算公式
应纳税所得额 = 年度收入 - 60000(基本减除费用) - 专项扣除 - 专项附加扣除
应纳税额 = 应纳税所得额 × 适用税率 - 速算扣除数
2. 税率表算法
采用逐级累进计算方式,通过查找表确定适用税率。
五、项目扩展建议
- 数据持久化:添加文件保存/加载功能
- 历史记录:记录多次计算结果
- 导出功能:支持 PDF/Excel 导出
- 联网更新:自动更新税率政策
- 图表展示:使用 JFreeChart 添加图表
六、注意事项
- 本程序为模拟器,实际报税请以官方系统为准
- 税率政策如有更新,需要相应修改代码
- 计算结果仅供参考,不构成税务建议
七、开源协议
本项目采用 MIT 开源协议,允许自由使用、修改和分发。


