不知道大家每個月發工資了會不會自己親手再計算一遍,特別是工資不固定的朋友.所以我寫了一個安卓的小demo,可以幫助大家計算工資,方便又快捷.
目前我是根據我公司的發放標準來計算的,大部分應該是這樣的,如果哪有區別可以提建議,我儘量把它做的大衆化.我們公司免繳稅額是3500,缺勤和加班每天的工資是基本工資/21.75,納稅的方式是按照北京納稅標準來的.現在最高納稅工資是35000元,再高了就計算不了了.
計算的方式是按照含稅級距的範圍*稅率計算的.有個速算扣除數,我到現在還沒有弄明白是啥意思,在網上可以查了一些關於這方面的東西,但我計算時好像跟他沒有關係,別人用了也沒有錯誤.本軟件現在還有什麼高的技能點,就有一個四捨五入保留兩位小數.不過我會一直維護的,因爲我也在用,如果大家想用可以到我的github上下載對應的demo.
我把我的代碼貼出來吧!歡迎賜教.
public class MainActivity extends AppCompatActivity {
EditText et_basic;//基本工資
EditText et_insure;//五險一金
EditText et_absence;//缺勤
EditText et_overtime;//加班
TextView tv_allRate;//總的個人所得稅
TextView tv_finalSalary;//最後所得工資
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_basic = (EditText) findViewById(R.id.et_basic);
et_insure = (EditText) findViewById(R.id.et_insure);
et_absence = (EditText) findViewById(R.id.et_absence);
et_overtime = (EditText) findViewById(R.id.et_overtime);
tv_allRate = (TextView) findViewById(R.id.tv_allRate);
tv_finalSalary = (TextView) findViewById(R.id.tv_finalSalary);
}
public void calculator(View view) {
String basic = et_basic.getText().toString().trim();
String insure = et_insure.getText().toString().trim();
String absence = et_absence.getText().toString().trim();
String overtime = et_overtime.getText().toString().trim();
float basicSalary = Float.parseFloat(basic);
float insureGold = Float.parseFloat(insure);
int absenceDay = Integer.parseInt(absence);//獲取缺勤天數
int overtimeDay = Integer.parseInt(overtime);//獲取加班天數
//計算應得工資
//如果加班或缺勤,每天的工資爲
double perDay = basicSalary / 21.75;
//計算總工資 = 基本工資 + 加班的工資 - 缺勤的工資
double allSalary = basicSalary + overtimeDay * perDay - absenceDay * perDay;
double youHave = allSalary - insureGold;
if (youHave < 0) {
ToastUtils.show("喫飯的錢都沒有了,還上五險作甚!");
return;
}
//需要納稅的工資 = 總工資 - 五險一金 - 免徵額(3500)
double payRate = youHave - 3500;
//由於是個人納稅,所以使用含稅級距的標準
double allRate = 0;
if (payRate > 0) {
allRate = caculateRate(payRate);
}
//最後贏得工資爲
double finalSalary = youHave - allRate;
//給控件賦值
tv_allRate.setText(roundDouble(allRate) + "");
tv_finalSalary.setText(roundDouble(finalSalary) + "");
}
/**
* 傳入工資納稅的部分,獲取總共需要交納的個人所得稅
* @param payRate 傳入工資納稅的部分
* @return 總共需要交納的個人所得稅
*/
private double caculateRate(double payRate) {
double allRate = 0;
/**
* 標準: 含稅級距 稅率(%)
* 不超過1500 3
* 1500-4500 10
* 4500-9000 20
* 9000-35000 25
*/
if (payRate < 1500) {
allRate = payRate * 0.03;
} else if (payRate < 4500) {
allRate = 45 + (payRate - 1500) * 0.1;
} else if (payRate < 9000) {
allRate = 45 + 300 + (payRate - 4500) * 0.2;
} else if (payRate < 35000) {
allRate = 45 + 300 + 900 + (payRate - 9000) * 0.1;
}
return allRate;
}
/**
* 小數 四捨五入 保留2位
*
* @param val 原始小數
* @return 四捨五入後保留的小數
*/
public static Double roundDouble(double val) {
Double ret = null;
try {
double factor = Math.pow(10, 2);
ret = Math.floor(val * factor + 0.5) / factor;
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}
}