2015-04-06 38 views
2

我正在努力解決如何以數字安全的方式計算汽車維修作業的總成本,避免舍入誤差。我得到了在一份工作上花費的時間,然後將它乘以一個不變的勞動力價值,以獲得正確的勞動成本,但是它沒有弄清楚它應該如何。這是我在工作中花了20分鐘時的例子。以安全方式乘以分數c#

enter image description here

這清楚地工作了錯了,因爲£30第三是£10,讓我怎麼避免舍入誤差,我的故事嗎?

這是我如何獲得總時間。

TimeSpan totalTime = TimeSpan.Zero; 

    foreach (DataRow timeEntry in dhJob.DataStore.Tables[jobTimeCollectionName].Rows) 
    { 
     DateTime start = Convert.ToDateTime(timeEntry["jobtimestart"]); 
     DateTime end = Convert.ToDateTime(timeEntry["jobtimeend"]); 
     totalTime += (end - start); 
    } 

    tb_labourtime.Text = Convert.ToString(Math.Round(totalTime.TotalHours, 2)); 

    tb_labourtotal.Text = (Convert.ToDouble(tb_labourtime.Text) * Convert.ToInt32(tb_labourrate.Text)).ToString(); 

任何幫助/建議表示讚賞。

+0

的面貌邁向'decimal'類型。 – Alex 2015-04-06 10:50:33

+3

@Alex他將時間轉換爲只有兩位數字的精度的字符串,所以沒有使用'decimal'的數量會解決這個問題(但我同意他應該使用'decimal'作爲解決方案的一部分 - 它只是不是整個解決方案) – 2015-04-06 10:52:30

+2

我認爲你最好提供一種輸入分鐘的方法。雖然'0.33'可能看起來很接近,但它仍然是'0.0033333 ...',從確切的結果來看,這可能會導致四捨五入。 – 2015-04-06 10:54:25

回答

2

首先,您將totalTime轉換爲僅具有兩位精度的字符串表示形式,該精度不會很準確。其次,在進行財務計算時,通常應該使用decimal類型,而不是double類型,這將爲您提供更高的準確性(儘管它仍不完全準確)。

做的第一件事就是用totalTime來計算工資總額,而不是使用轉換後的字符串值:

tb_labourtotal.Text = (totalTime.TotalHours * Convert.ToInt32(tb_labourrate.Text)).ToString(); 
+0

非常感謝@MatthewWatson。轉換爲字符串時,我不知道精度損失。將雙打更改爲十進制,並停止轉換文本數字類型,它更好。再次感謝。 – user2992802 2015-04-06 12:37:47