2015-04-06 36 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