2016-01-08 55 views
1

我遇到了一個c#工資計劃舍入問題。小數點不正確舍入

我用15.50小時率x 39.75小時測試它。總收入達616.125美元,毛額達到616.13美元。

然後我做了25%的固定所得稅,這意味着(15.50 X 39.75),最終的淨產X 0.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(); 
} 
+11

您應該只在計算的最後四捨五入,而不是在每個中間步驟。 –

+0

但是,如果我不在乘法期間舍入總薪酬,那麼它不會正確計算。我需要它們在計算過程中被正確舍入 – Programmer7

回答

2

616.125經歷中點舍入。 decimal默認使用銀行家的舍入。所以(這是你可以自己檢查很容易如果你只是通過您的代碼步):

Math.Round(616.125M, 2) // 616.12M 

當然,你也四捨五入到小數,所以你實際上是無論如何,我們都得到了616.125M而不是616.12M(或616.13M)。

你正在做一件相當危險的事情 - 你正在猜測稅務計算。不要這樣做。找到適用的稅法 - 他們將有計算稅款的確切方法。按照這些加入T。他們指定了何時何地以及如何圍繞任何東西。最有可能的是,所有四捨五入(除了最終的價格/稅)應該是小數點後四位,而不是兩個,但再次,不要猜測 - 閱讀法律,並確保你完全理解它們。

+1

要「修復」它,請使用'Math.Round'並傳遞正確的'MidPointRounding'值。 https://msdn.microsoft.com/en-us/library/system.midpointrounding(v=vs.110).aspx –

+0

我只是做一個測試程序,我知道25%並不是每個人的稅率。我只是想弄清楚如何顯示(15.50 x 39.75)x .25 = 462.10而不是462.09 – Programmer7

+1

@ Programmer7這與我的答案有什麼關係?我正在談論計算稅款的規則,而不是稅率。我也解釋了爲什麼你會得到你的「異常」結果 - 你頭腦中使用的舍入算法不是你在代碼中使用的算法。 – Luaan

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,並得到你所期望的結果。

+0

正如我的回答指出的那樣,'616.125M'實際上輪到'616.12',而不是'616.13'。 – Luaan

+0

616.125應該輪到616.13,儘管 – Programmer7

+0

@程序員7你四捨五入到小數點後三位,其中「616.125」落在裏面,所以它沒有嘗試進一步舍入。 –