年关将至,该到了发年终奖的时候了。所以就到网上去找下,个税计算器,但是发现做的有点像病毒网站似的。所以计算结果也不太敢信,于是琢磨着,要不自己动手写一个个税计算器吧。

说干就干,先上国家税务局了解了下个税计算的公式,说简单也简单说复杂也复杂,个税计算,分几个种类:

1、综合税率表

一般来说,我们员工的工资就按这个税率表来计算。

2、经营所得

这个应该是个体工商户类的适用

3、劳务报酬

这个一般适用于,比如有个兼职,外包等,如果要纳税,就按这个税率表。

这个是2018年最新的个税税率,现在统一按5000元起征,也就是收入在5000元以下,是不用纳税的。

项目采用springboot开发,非常容易上手。

计算规则的代码:

    /**
* 计算个人所得税
* www.xcc.cn 版权所有
* @param minusAmount 扣除社保的金额
* @param minusAmount2 当月工资(扣除社保后)(算年终奖)
* @param salaryType 收入类型
* @param minimumAmount 个税基数,5000
* */
public GeshuiDto calc(double originAmount, double minusAmount, double minusAmount2, String salaryType, int minimumAmount) {
GeshuiDto dto = new GeshuiDto();
dto.originAmount = originAmount;
dto.minusAmount = minusAmount;
dto.taxAmount = 0;
dto.finalAmount = 0; if(originAmount == 0){
return dto;
} //工资、薪金所得
if(Objects.equal("1", salaryType)){
double balanceAmount = BigDecimal.valueOf(originAmount)
.subtract(BigDecimal.valueOf(minusAmount))
.subtract(BigDecimal.valueOf(minimumAmount)).doubleValue();
dto.balanceAmount = balanceAmount;
if(minimumAmount == 5000) {
if(balanceAmount >0 && balanceAmount <=3000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.03)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}
if(balanceAmount >3000 && balanceAmount <=12000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.1)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(210)).doubleValue();
}
if(balanceAmount >12000 && balanceAmount <=25000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(1410)).doubleValue();
}
if(balanceAmount >25000 && balanceAmount <=35000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.25)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(2660)).doubleValue();
}
if(balanceAmount >35000 && balanceAmount <=55000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.3)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(4410)).doubleValue();
}
if(balanceAmount >55000 && balanceAmount <=80000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.35)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(7160)).doubleValue();
}
if(balanceAmount >80000 ){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.45)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(15160)).doubleValue();
}
}else {
if(balanceAmount >0 && balanceAmount <=1500){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.03)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}
if(balanceAmount >1500 && balanceAmount <=4500){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.1)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(105)).doubleValue();
}
if(balanceAmount >4500 && balanceAmount <=9000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(555)).doubleValue();
}
if(balanceAmount >9000 && balanceAmount <=35000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.25)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(1005)).doubleValue();
}
if(balanceAmount >35000 && balanceAmount <=55000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.3)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(2755)).doubleValue();
}
if(balanceAmount >55000 && balanceAmount <=80000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.35)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(5505)).doubleValue();
}
if(balanceAmount >80000 ){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.45)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(13505)).doubleValue();
}
} }else if(Objects.equal("2", salaryType)){ //个体工商户生产、经营所得
double balanceAmount = originAmount;
dto.balanceAmount = balanceAmount;
if(balanceAmount >0 && balanceAmount <= 15000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.05)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}
if(balanceAmount > 15000 && balanceAmount <= 30000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.1)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(750)).doubleValue();
}
if(balanceAmount > 30000 && balanceAmount <= 60000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(3750)).doubleValue();
}
if(balanceAmount > 60000 && balanceAmount <= 100000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.3)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(9750)).doubleValue();
}
if(balanceAmount > 100000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.35)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(14750)).doubleValue();
}
}else if(Objects.equal("3", salaryType)){ //年终奖所得
double balanceAmount = 0;
if(minusAmount2 - minimumAmount < 0){
balanceAmount = BigDecimal.valueOf(originAmount).subtract(BigDecimal.valueOf(3500-minusAmount2)).doubleValue();
}else{
balanceAmount = originAmount;
}
dto.balanceAmount = balanceAmount;
double avg_balanceAmount = balanceAmount/12;
if(minimumAmount == 5000) {
if(avg_balanceAmount >0 && avg_balanceAmount<=3000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.03)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}
if(avg_balanceAmount >3000 && avg_balanceAmount<=12000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.1)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(210)).doubleValue();
}
if(avg_balanceAmount >12000 && avg_balanceAmount<=25000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(1410)).doubleValue();
}
if(avg_balanceAmount >25000 && avg_balanceAmount<=35000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.25)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(2660)).doubleValue();
}
if(avg_balanceAmount >35000 && avg_balanceAmount<=55000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.3)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(4410)).doubleValue();
}
if(avg_balanceAmount >55000 && avg_balanceAmount<=80000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.35)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(7160)).doubleValue();
}
if(avg_balanceAmount >80000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.45)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(15160)).doubleValue();
}
}else {
if(avg_balanceAmount >0 && avg_balanceAmount<=1500){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.03)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}
if(avg_balanceAmount >1500 && avg_balanceAmount<=4500){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.1)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(105)).doubleValue();
}
if(avg_balanceAmount >4500 && avg_balanceAmount<=9000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(555)).doubleValue();
}
if(avg_balanceAmount >9000 && avg_balanceAmount<=35000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.25)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(1005)).doubleValue();
}
if(avg_balanceAmount >35000 && avg_balanceAmount<=55000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.3)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(2775)).doubleValue();
}
if(avg_balanceAmount >55000 && avg_balanceAmount<=80000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.35)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(5505)).doubleValue();
}
if(avg_balanceAmount >80000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.45)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(13505)).doubleValue();
}
} }else if(Objects.equal("4", salaryType)){ //劳务报酬所得
dto.balanceAmount = originAmount;
if(originAmount>0 && originAmount <= 800){
dto.taxAmount =0;
}else if(originAmount > 800){
double balanceAmount = 0;
if(originAmount >800 && originAmount <= 4000){
balanceAmount = originAmount-800;
}
if(originAmount > 4000){
balanceAmount = originAmount*0.8;
}
if(balanceAmount >0 && balanceAmount <= 20000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}
if(balanceAmount >20000 && balanceAmount <= 50000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.3)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(2000)).doubleValue();
}
if(balanceAmount >50000){
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.4)).setScale(2, BigDecimal.ROUND_HALF_UP).subtract(BigDecimal.valueOf(7000)).doubleValue();
}
}
}else if(Objects.equal("5", salaryType)){ //稿酬所得
double balanceAmount = 0;
if(originAmount >0 && originAmount <= 4000){
balanceAmount = originAmount-800;
}else if(originAmount > 4000){
balanceAmount = originAmount*0.8;
}
dto.balanceAmount = balanceAmount;
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.14)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}else if(Objects.equal("6", salaryType)){ //特许权使用费所得
double balanceAmount = 0;
if(originAmount >0 && originAmount <= 4000){
balanceAmount = originAmount-800;
}else if(originAmount > 4000){
balanceAmount = originAmount*0.8;
}
dto.balanceAmount = balanceAmount;
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}else if(Objects.equal("7", salaryType)){ //财产租赁所得
double balanceAmount = 0;
if(originAmount >0 && originAmount <= 4000){
balanceAmount = originAmount-800;
}else if(originAmount > 4000){
balanceAmount = originAmount*0.8;
}
dto.balanceAmount = balanceAmount;
dto.taxAmount = BigDecimal.valueOf(balanceAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}else if(Objects.equal("8", salaryType)){ //财产转让所得
dto.balanceAmount = originAmount;
dto.taxAmount = BigDecimal.valueOf(originAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}else if(Objects.equal("9", salaryType)){ //利息、股息、红利所得
dto.balanceAmount = originAmount;
dto.taxAmount = BigDecimal.valueOf(originAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}else if(Objects.equal("10", salaryType)){ //偶然所得
dto.balanceAmount = originAmount;
dto.taxAmount = BigDecimal.valueOf(originAmount).multiply(BigDecimal.valueOf(0.2)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}else{
return dto;
}
if(Objects.equal("1", salaryType)){
dto.finalAmount = BigDecimal.valueOf(originAmount)
.subtract(BigDecimal.valueOf(minusAmount))
.subtract(BigDecimal.valueOf(dto.taxAmount))
.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}else{
dto.finalAmount = BigDecimal.valueOf(originAmount)
.subtract(BigDecimal.valueOf(dto.taxAmount))
.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
}
return dto;
}

既然开发完了,就想着,弄个域名,挂个服务器给大家用一用,正好手头也有一个空着的域名xcc.cn,就搭建部署上线了。部署上,使用了jenkins+portainer,将项目打成了docker镜像,然后推到portainer部署启动。

个税计算器目前的公式上,可能有考虑不周的地方,大家可以指出来。

欢迎大家围观:个税计算器 ,各位下手轻点,别弄残了。

个人所得税计算java版的更多相关文章

  1. 0330复利计算java版

    package compounding; import java.util.Scanner; public class compounding1_1 { public static void main ...

  2. 复利计算--4.0 单元测试之JAVA版-软件工程

    复利计算--4.0 单元测试-软件工程 前言:由于本人之前做的是C语言版的复利计算,所以为了更好地学习单元测试,于是将C语言版的复利计算修改为JAVA版的. 一.主要的功能需求细分: 1.本金为100 ...

  3. 微博地址url(id)与mid的相互转换 Java版

    原理: 新浪微博的URL都是如:http://weibo.com/2480531040/z8ElgBLeQ这样三部分. 第一部分(绿色部分)为新浪微博的域名,第二部分(红色部分)为博主Uid,第三部分 ...

  4. 剑指Offer——回溯算法解迷宫问题(java版)

    剑指Offer--回溯算法解迷宫问题(java版)   以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.设计程序,对任意设定的迷宫,求出从入口到出口的所有通路.   下面我们来详细讲一 ...

  5. 20165234 [第二届构建之法论坛] 预培训文档(Java版) 学习总结

    [第二届构建之法论坛] 预培训文档(Java版) 学习总结 我通读并学习了此文档,并且动手实践了一遍.以下是我学习过程的记录~ Part1.配置环境 配置JDK 原文中提到了2个容易被混淆的概念 JD ...

  6. 遗传算法 | Java版GA_TSP(我的第一个Java程序)

    嗯哼,第一次写博客,准确说是第一次通过文字的方式记录自己的工作,闲话少叙,技术汪的博客就该直奔技术主题(关于排版问题,会在不断写博客的过程中慢慢学习,先将就着用吧,重在技术嘛~~~). 遗传算法(Ge ...

  7. 常见排序算法题(java版)

    常见排序算法题(java版) //插入排序:   package org.rut.util.algorithm.support;   import org.rut.util.algorithm.Sor ...

  8. 个人永久性免费-Excel催化剂功能第40波-工资、年终奖个人所得税计算函数

    学Excel的表哥表姐们必定有接触过个人所得税的案例学习,在计算个人所得税这个需求上,大家的层次也是很多种多样,当然Excel催化剂推荐的方式仍然是经过封装后的简单明了的自定义函数的方式,此篇已为财务 ...

  9. 剑指offer题解(Java版)

    剑指offer题解(Java版) 从尾到头打印链表 题目描述 输入一个链表,按从尾到头的顺序返回一个ArrayList. 方法1:用一个栈保存从头到尾访问链表的每个结点的值,然后按出栈顺序将各个值存入 ...

随机推荐

  1. kali linux之msf后渗透阶段

    已经获得目标操作系统控制权后扩大战果 提权 信息收集 渗透内网 永久后门 基于已有session扩大战果 绕过UAC限制 use exploit/windows/local/ask set sessi ...

  2. LOJ#3084. 「GXOI / GZOI2019」宝牌一大堆(递推)

    题面 传送门 题解 为什么又是麻将啊啊啊!而且还是我最讨厌的爆搜类\(dp\)-- 首先国士无双和七对子是可以直接搞掉的,关键是剩下的,可以看成\(1\)个雀头加\(4\)个杠子或面子 直接\(dp\ ...

  3. 渗透日常之 花式实战助你理解CSRF

    本文作者:i春秋签约作家——onls辜釉 最近比较忙,很久没发文章了,Onls本就只是一个安全爱好者,工作也不是安全相关.以往的文章也更像是利用简单漏洞的“即兴把玩”,更多的是偏向趣味性,给大家增加点 ...

  4. ElasticSearch.net NEST批量创建修改删除索引完整示例

    本示例采用Elasticsearch+Nest 网上查了很多资料,发现用C#调用Elasticsearch搜索引擎的功能代码很分散,功能不完整,多半是非常简单的操作,没有成型的应用示例.比如新增或修改 ...

  5. 3. STL编程三

    1. 算法容器的使用: #include <iostream> #include <functional> #include <vector> #include & ...

  6. Mutation Observer

    MutationEvent Mutation Observer 变动观察器, 等待所有脚本任务完成后,才会运行(即异步触发方式) 把DOM变动记录封装成一个数组进行处理,而不是一条条个别处理DOM变动 ...

  7. Markdown数学公式速查记录

    参考: Markdown数学公式语法 markdown最全数学公式速查 行内与独行 行内公式:将公式插入到本行内,符号:$公式内容$,如:$xyz$ 独行公式:将公式插入到新的一行内,并且居中,符号: ...

  8. SpringMVC初写(二)映射类型、限制和数据绑定

    映射路径 a)映射路径的概述 所谓的映射路径,就是匹配请求路径和执行方法关系的路径 请求路径:http://localhost:8080/springmvc-demo-cofig/say.do 映射路 ...

  9. IE8下不识别indexOf的问题

    1.为Array原型添加indexOf方法(如果学过面向对象,相当于给Array类添加实例方法),方法体如下: //添加数组IndexOf方法 if (!Array.prototype.indexOf ...

  10. 全网最详细的Git学习系列之介绍各个Git图形客户端(Windows、Linux、Mac系统皆适用ing)(图文详解)

    不多说,直接上干货! 一.TortoiseGit - The coolest Interface to Git Version Control TortoiseGit 是 TortoiseSVN 的  ...