个人所得税计算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:用一个栈保存从头到尾访问链表的每个结点的值,然后按出栈顺序将各个值存入 ...
随机推荐
- WEB基础技术(汇聚页)
WEB基础技术(汇聚页) ------------------------------------------------- WEB WEB概述 HTML CSS JavaScript JavaScr ...
- NOI2019省选模拟赛 第六场
传送门 又炸了-- \(A\) 唐时月夜 不知道改了什么东西之后就\(A\)掉了\(.jpg\) 首先,题目保证"如果一片子水域曾经被操作过,那么在之后的施法中,这片子水域也一定会被操作&q ...
- sublime text 显示 typescript高亮
用ionic angular2写东西,还是用我的sublime 发现ts文件不识别,没有高亮.搜呗. 搜索出来的博客地址:http://www.cnblogs.com/happen-/p/638553 ...
- ELK安装成windows服务
一.Elasticsearch安装成windows服务 我的es所在路径为:D:\ELK5.5.0\elasticsearch-5.5.0 Java 安装目录为:C:\Program Files\Ja ...
- PHP中引入文件的四种方式详解
四种语句 PHP中有四个加载文件的语句:include.require.include_once.require_once. 基本语法 require:require函数一般放在PHP脚本的最前面,P ...
- mybatis的mapper.xml使用parameterType使用的报错
错误在于一个写的get(Long id)的查询方法, 而在Mapper.xml中我定义了这个接收的参数的类型是int类型, 结果就报了如下的错误 org.mybatis.spring.MyBatisS ...
- 关于nginx的一个错误操作记录
今天在弄前后端同步的测试的时候,前端用Nginx代理访问后端接口,由于启动了多次nginx软件,没有将前几次启动的nginx进程关闭,导致在访问后端接口的request被挂起,过了半天也没有结果返回, ...
- scrapy框架安装及使用
一.Windows安装 Twisted下载及安装 在https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载对应的Twisted的版本文件 在命令行进入到Twist ...
- Thread.Sleep(1000) 、Task.Delay(1000).Wait() 区别
public static Task Delay(int millisecondsDelay, CancellationToken cancellationToken){ if (millise ...
- Android各版本及API对应关系,持续更新!
以下是Android的各个版本与API的对应关系图标,便于查阅,会持续更新 API等级 Android版本号 Android版本名称 对应支持包 API等级1: Android 1.0 API ...