新个税计算html、以及java源代码
前言
2019年1月1日起,新个税改革正式全面实施,个税按照年累计的方式计算,个税改革与大家工资息息相关,所以闲来无事用jsp和java代码实现新个税计算。
一、html格式
直接用html格式的话,不用服务器部署,直接浏览就可以打开了。请忽略格式,代码如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>个人所得税计算器</title>
<script>
window. quickRateText = '{"3":0,"10":2520,"20":16920,"25":31920,"30":52920,"35":85920,"45":181920}';
//全局变量速算扣除数据
window.quickRate = window.JSON.parse(quickRateText);
window.rateText = '{"3":36000,"10":144000,"20":300000,"25":420000,"30":660000,"35":960000,"45":999999999}';
//全局变量税率
window.rate = window.JSON.parse(rateText);
function cal(){//开始计算
var arr=new Array();
arr[0]= document.getElementById("TaxSalary").value;
arr[1]= document.getElementById("Insurance").value;
arr[2]= document.getElementById("Special").value;
arr[3]= document.getElementById("Month").value;
for (var i=0;i<arr.length;i++)
{
checkdata(arr[i]);//数据校验
}
CheckMonth(arr[3]) ;//月份校验
var totalPay=0;//缴税累计金额
var taxPay=0;//本月应缴税额
document.getElementById("result").innerHTML="";//清空计算结果
for(var i=1;i<=arr[3];i++){
var TaxMoney=(arr[0]-arr[1]-arr[2]-5000)*i;
if(TaxMoney<0){ //不用交税
document.getElementById("result").innerHTML+="<p>恭喜你!!!你不用交税哦!!!!</p>";
return;
}
var taxRateString=getTaxRate(TaxMoney);
var taxRate=taxRateString/100;
var quickData= quickRate[taxRateString];
totalPay=totalPay+taxPay;
taxPay=TaxMoney*taxRate-quickData-totalPay;
document.getElementById("result").innerHTML+="<p>第"+i+"月: 应交税额: "+TaxMoney.toFixed(2)+" 适应税率: "+taxRate+" 速算扣除数: "+quickData+ " 往月缴税金额: "+totalPay.toFixed(2)+" 本月应缴税额: "+taxPay.toFixed(2)+"</p>";
}
}
function getTaxRate(value) {//根据需要交税的金额获取相应的税率
if(value<0) return 0;
for (var prop in rate){
if(value<=rate[prop])
return prop ;
}
}
function checkdata(value){
CheckIsNull(value);
if (isNaN(value)) {//用isNaN开始判断,如果成立就是非数字
alert("请输入正确的数值");
return false;
}
var len1 = value.substr(0,1);
var len2 = value.substr(1,1);
//如果第一位是0,第二位不是点,就用数字把点替换掉
if(value.length > 1 && len1==0 && len2 != '.'){
alert("请输入正确的数值");
return false;
}
if(value<0){
alert("请输入大于或者等于0的正确的数值");
return false;
}
}
function checkdata_Onblur(obj){//输入框失去焦点数据校验
var value=obj.value;
CheckIsNull(value);
if (isNaN(value)) {//用isNaN开始判断,如果成立就是非数字
alert("请输入正确的数值");
return false;
}
var id= obj.id;
if(id=="Month"){
CheckMonth(value);
}
var len1 = value.substr(0,1);
var len2 = value.substr(1,1);
//如果第一位是0,第二位不是点,就用数字把点替换掉
if(value.length > 1 && len1==0 && len2 != '.'){
alert("请输入正确的数值");
return false;
}
if(value<0){
alert("请输入大于或者等于0的正确的数值");
return false;
}
}
function CheckMonth(value){//月份校验
var len1 = value.substr(0,1);
if(value.length >= 1 && len1==0 ){
alert("请输入正确的月份");
return false;
}
if(value.indexOf(".")>0){
alert("月份不能是小数,请重新输入正确的月份");
return false;
}
}
function CheckIsNull( value){//非空校验
if (value==null||value==""){
alert( "数据不能为空!请重新输入");
return false;
}
}
</script>
</head>
<body>
<div style="text-align:center"><p><span style="display:inline-block;width:250px;text-align:right; margin:0px 200px">个税计算器</span> </p></div>
<form action="form_action.asp" method="get">
<div style="text-align:center"> <p><span style="display:inline-block;width:250px;text-align:right;">每月税前工资:</span><input id="TaxSalary" onblur="checkdata_Onblur(this)" name="TaxSalary" required /> </p>
<p><span style="display:inline-block;width:250px;text-align:right;">五险一金扣除金额:</span><input id="Insurance" onblur="checkdata_Onblur(this)" name="Insurance" /> </p>
<p><span style="display:inline-block;width:250px;text-align:right;">专项扣除金额:</span><input id="Special" onblur="checkdata_Onblur(this)" name="Special" /> </p>
<p><span style="display:inline-block;width:250px;text-align:right;">月份(1-12):</span><input id="Month" onblur="checkdata_Onblur(this)" name="Month" /> </p>
<p><button style="margin:100px"type="button" onclick="cal()">开始计算</button> </p>
</div>
<div style="text-align:center" id="result"></div>
</form>
</body>
</html>
效果如下:
可以看到,月薪1w有专项扣除和没有专项扣除交税情况差别还是挺大的。
二、java代码
import java.util.Scanner;
public class CalcRate {
public static final double base = 5000.00;// 纳税基准
static double rateAmount = 0;// 每月税额
static double beforeAmount = 0;// 税前金额
static double totlerate = 0;// 累计税额
static double[] rate;// 税率
static double p = 0;// 专项扣除
static double q = 0;// 速算扣除
static double n = 0;// 五险一金扣除
static int month = 1;// 月份
static double[][] rates = { { 0, 0, 0 }, { 36000, 0.03, 0 },
{ 144000, 0.1, 2520 }, { 3000000, 0.2, 16920 },
{ 420000, 0.25, 31920 }, { 660000, 0.3, 52920 },
{ 960000, 0.35, 85920 }, { 999999999, 0.45, 181920 } };
public static double[] getRate(double totale) {
double[] rate = { 36000, 0.03, 0 };
for (int i = 1; i < rates.length; i++) {
if (totale <= rates[0][0]) {
rate = rates[0];
} else if (totale > rates[i - 1][0] && totale <= rates[i][0]) {
rate = rates[i];
break;
}
}
return rate;
}
public static double inputDouble(String message) {
double input = -1;
while (true) {
System.out.println(message);
try {
Scanner in = new Scanner(System.in);
input = in.nextDouble();
} catch (Exception e) {
}
if (input < 0) {
System.out.println("请输入一个正数值..");
} else {
break;
}
}
return input;
}
public static int inputMonth() {
int input = -1;
while (true) {
System.out.println("请输入月份:");
try {
Scanner in = new Scanner(System.in);
input = in.nextInt();
} catch (Exception e) {
}
if (input < 1 || input >12) {
System.out.println("请输入一个正确月份..");
} else {
break;
}
}
return input;
}
public static void main(String[] args) {
while (true) {
rateAmount = 0;
totlerate = 0;
System.out.println("-----------个税计算-------------");
beforeAmount = inputDouble("请输入每月税前金额:");
n = inputDouble("请输入五险一金扣除金额:");
q = inputDouble("请输入专项扣除金额:");
month = inputMonth();
for(int i = 1;i<= month;i++){
double amount = (beforeAmount - n - q -base)*i;
rate = getRate(amount);
rateAmount = Math.round(( amount * rate[1])*100)/100 - rate[2]- totlerate;
System.out.println("第"+i+"月:应纳税金额:"+amount+",税率:"+rate[1]+",速算扣除金额:"
+rate[2]+",往月纳税金额合计:"+totlerate+",本月应缴税额:"+rateAmount);
totlerate = totlerate+rateAmount;
}
}
}
}
结果如下: