个人所得税计算java版
年关将至,该到了发年终奖的时候了。所以就到网上去找下,个税计算器,但是发现做的有点像病毒网站似的。所以计算结果也不太敢信,于是琢磨着,要不自己动手写一个个税计算器吧。
说干就干,先上国家税务局了解了下个税计算的公式,说简单也简单说复杂也复杂,个税计算,分几个种类:
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版的更多相关文章
- 0330复利计算java版
package compounding; import java.util.Scanner; public class compounding1_1 { public static void main ...
- 复利计算--4.0 单元测试之JAVA版-软件工程
复利计算--4.0 单元测试-软件工程 前言:由于本人之前做的是C语言版的复利计算,所以为了更好地学习单元测试,于是将C语言版的复利计算修改为JAVA版的. 一.主要的功能需求细分: 1.本金为100 ...
- 微博地址url(id)与mid的相互转换 Java版
原理: 新浪微博的URL都是如:http://weibo.com/2480531040/z8ElgBLeQ这样三部分. 第一部分(绿色部分)为新浪微博的域名,第二部分(红色部分)为博主Uid,第三部分 ...
- 剑指Offer——回溯算法解迷宫问题(java版)
剑指Offer--回溯算法解迷宫问题(java版) 以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.设计程序,对任意设定的迷宫,求出从入口到出口的所有通路. 下面我们来详细讲一 ...
- 20165234 [第二届构建之法论坛] 预培训文档(Java版) 学习总结
[第二届构建之法论坛] 预培训文档(Java版) 学习总结 我通读并学习了此文档,并且动手实践了一遍.以下是我学习过程的记录~ Part1.配置环境 配置JDK 原文中提到了2个容易被混淆的概念 JD ...
- 遗传算法 | Java版GA_TSP(我的第一个Java程序)
嗯哼,第一次写博客,准确说是第一次通过文字的方式记录自己的工作,闲话少叙,技术汪的博客就该直奔技术主题(关于排版问题,会在不断写博客的过程中慢慢学习,先将就着用吧,重在技术嘛~~~). 遗传算法(Ge ...
- 常见排序算法题(java版)
常见排序算法题(java版) //插入排序: package org.rut.util.algorithm.support; import org.rut.util.algorithm.Sor ...
- 个人永久性免费-Excel催化剂功能第40波-工资、年终奖个人所得税计算函数
学Excel的表哥表姐们必定有接触过个人所得税的案例学习,在计算个人所得税这个需求上,大家的层次也是很多种多样,当然Excel催化剂推荐的方式仍然是经过封装后的简单明了的自定义函数的方式,此篇已为财务 ...
- 剑指offer题解(Java版)
剑指offer题解(Java版) 从尾到头打印链表 题目描述 输入一个链表,按从尾到头的顺序返回一个ArrayList. 方法1:用一个栈保存从头到尾访问链表的每个结点的值,然后按出栈顺序将各个值存入 ...
随机推荐
- 如何获取token值
登录的时候需要拿到token值,需要跟后端配合才能拿到 官方说明: https://developers.weixin.qq.com/miniprogram/dev/api/api-login.htm ...
- kvm快照备份及常用命令
转载自:http://www.myjishu.com/?p=431 好文章 kvm快照备份及常用命令 kvm快照,分两种: 1种lvm快照,如果分区是lvm,可以利用lvm进行kvm的快照备份 2种由 ...
- BZOJ 1934--善意的投票(最小割)
1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 2354 Solved: 1471[Submit][ ...
- Jzoj 初中2249 蒸发学水(并查集)
题目描述 众所周知,TerryHu 是一位大佬,他平时最喜欢做的事就是蒸发学水. 机房的位置一共有n 行m 列,一开始每个位置都有一滴学水,TerryHu 决定在每一个时刻选择 一滴学水进行蒸发,直到 ...
- python 快速幂求斐波那契数列
先占坑 后面再写详细的 import numpy as np def pow(n): a = np.array([[1,0],[0,1]]) b = np.array([[1,1],[1,0]]) n ...
- Eclipse署动态web项目方法
和MyEclipse不一样,在Eclipse中做的Web项目默认是不支持将项目发布到Web服务器上的,会发布到工作空间的某个目录,因此无法在外部启动Tomcat来运行Web项目,只有打开Eclipse ...
- C语言数据结构之二叉树的实现
本篇博文是博主在学习C语言算法与数据结构的一些应用代码实例,给出了以二叉链表的形式实现二叉树的相关操作.如创建,遍历(先序,中序后序遍历),求树的深度,树的叶子节点数,左右兄弟,父节点. 代码清单如下 ...
- 使用TortoiseSVN客户端管理IntelliJ IDEA项目的方法
使用TortoiseSVN客户端管理IntelliJ IDEA项目的方法 今天在打开一个使用SVN管理的项目时,IntelliJ IDEA提示: Can't use Subversion comman ...
- Vue 不睡觉教程2 - 洋气的文件结构
目标书接上回,上回那个例子实在太土了.实际开发中我们不可能把整个网站的js和html全写到一个页面上.所以我们这节课的目标在于改造这个例子的文件结构,让它不那么土Let's do it 环境参数vue ...
- 牛客Wannafly挑战赛26E 蚂蚁开会(树链剖分+线段树)
传送门 题面描述 一颗n个节点的树,m次操作,有点权(该节点蚂蚁个数)和边权(相邻节点的距离). 三种操作: 操作1:1 i x将节点i的点权修改为x.(1 <= i <= n; 1 &l ...