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

+3

@Alex Он преобразует время в строку только с двумя цифрами точности, поэтому никакое количество использования 'decimal' не исправит это (но я согласен, что он должен использовать' decimal' как часть решения - это просто не целое решение) –

+2

Думаю, вам лучше обеспечить способ ввода минут. Хотя '0.33' может выглядеть близко, он по-прежнему« 0.0033333 ... »из точного результата, который может изменить разворот. –

ответ

2

Во-первых, вы преобразовываете totalTime в строковое представление, которое имеет только две цифры точности, что не будет очень точным.

Во-вторых, при проведении финансовых расчетов вы должны использовать тип decimal, а не тип double, что даст вам большую точность (хотя оно все еще не полностью точно).

Первое, что нужно сделать, это использовать totalTime для расчета общей суммы заработной платы, а не использовать преобразованное значение строки:

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

Большое спасибо @MatthewWatson. Я не знал о точности потери при преобразовании в строку. Изменены двойные значения до десятичных и перестали конвертировать текстовые числовые типы, и это намного лучше. Еще раз спасибо. – user2992802

Смежные вопросы