我在使用c#Payroll计划进行四舍五入有问题。
我用15.50小时率x 39.75小时测试了它。总薪酬为616.125美元,总计为616.13美元。
然后我缴纳了25%的固定所得税,这意味着最终的净工资为(15.50 x 39.75)x .25 = 462.10
然而,它仍然显示净支付为462.09,因此不得使用显示部分的舍入总支付。总薪酬和所得税正确显示
以下是所有代码,我的猜测是这条线需要改变:
decimal incomeTax = Math.Round(grossPay, 3) * taxRate;
我需要做些什么来让它正确地圆?
decimal hourlyRate = 0;
decimal hoursWorked = 0;
decimal grossPay = 0m;
decimal incomeTax = 0m;
decimal netPay = 0m;
decimal taxRate = .25m;
private void btnCalculate_Click(object sender, EventArgs e)
{
decimal hourlyRate = Convert.ToDecimal(txtHourlyRate.Text);
decimal hoursWorked = Convert.ToDecimal(txtHoursWorked.Text);
decimal grossPay = Math.Round(hourlyRate * hoursWorked, 3);
decimal incomeTax = Math.Round(grossPay, 3) * taxRate;
decimal netPay = grossPay - incomeTax;
txtGrossPay.Text = grossPay.ToString("c");
txtIncomeTax.Text = incomeTax.ToString("c");
txtNetPay.Text = netPay.ToString("c");
}
private void btnClear_Click(object sender, EventArgs e)
{
hourlyRate = 0;
hoursWorked = 0;
grossPay = 0m;
incomeTax = 0m;
netPay = 0m;
txtHourlyRate.Text = "";
txtHoursWorked.Text = "";
txtGrossPay.Text = "";
txtIncomeTax.Text = "";
txtNetPay.Text = "";
}
private void btnExit_Click(object sender, EventArgs e)
{
this.Close();
}
答案 0 :(得分:2)
616.125
经历中点四舍五入。默认情况下,decimal
会使用银行家的四舍五入。所以(如果您只是单步执行代码,那么您可以非常轻松地查看 ):
Math.Round(616.125M, 2) // 616.12M
当然,您还要四舍五入到三个小数位,因此您实际上得到的是616.125M
而不是616.12M
(或{{1无论如何。
你正在做一些非常危险的事情 - 你在猜测税收计算。不要这样做。查找适用的税法 - 它们将具有用于计算税收的确切方法。按照到T 。它们指定了在何处,何时以及如何对任何事物进行舍入最有可能的是,所有舍入(最终价格/税除外)应该是小数点后四位,而不是两位,但是再次,不要猜测 - 阅读法律,并制作确定你完全理解它们。
答案 1 :(得分:0)
decimal grossPay = Math.Round(hourlyRate * hoursWorked, 3);
返回616.125
,其余计算正确导致462.09....
。
应该是
decimal grossPay = Math.Round(hourlyRate * hoursWorked, 2, MidpointRounding.AwayFromZero);
注意第二个参数,即舍入到的小数位数是2而不是3,以及MidpointRounding参数,它将616.125
舍入到616.13
并获得您期望的结果。