小数没有正确舍入

时间:2016-01-08 20:40:37

标签: c#

我在使用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();
}

2 个答案:

答案 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并获得您期望的结果。