2015-04-13 3 views
1

Я, кажется, теряю десятичное разрешение, когда выполняю расчет ниже. Кажется, что независимо от того, какое число я рассчитываю, я всегда заканчиваю с некоторой четвертью (например, x.00, x.25, x.50, 0r x.75) в десятичной системе. Спасибо за помощь. Я знаю, что mph.ToString («n2») сократит его до двух десятичных знаков, но почему в кварталы?C# Потеря десятичного разрешения при выполнении вычисления

int totalRotations = 0; 
int lastRotations = 0; 
int diffRotations = 0; 
int hourRotations = 0; 
double mph = 0; 
double distance = 0; 


private void calcMPH() 
{ 
    UInt16 val = CounterInputReader.ReadScanUInt16(); 

    totalRotations = val; 
    diffRotations = totalRotations - lastRotations; 
    hourRotations = diffRotations * 3600; 
    distance = hourRotations * 1.8333333; //wheel constant, (feet/pulse). Changes per diameter of wheel. 

    mph = distance/5280; 

    StatusBox1.Text = StatusBox1.Text + System.Environment.NewLine + "Load Array Rotor Speed: " + mphWind + " : " + scan.Length; 

    sensorScans.Add(Settings1.Default.Ch1c, mph); 

    //Why are we losing the decimal point resolution and only limited to quarters (0.00, 0.25, 0.50, 0.75)? 
    lblSpeedValue.Text = mph.ToString("n2") + " mph"; 

    lastRotations = totalRotations; //Save last Rotations per Pulse for mph calculations. 

} 
+2

'расстояние/5280' деление на целое число? '5280.0' – Sayse

+1

попробуйте использовать' decimal' вместо double. добавьте суффикс 'M' к числу, чтобы сделать его« десятичным ». ex: 'diffRotations * 3600m;' – DLeh

+4

'double' лучше, чем' decimal' для такого расчета. – DrKoch

ответ

4

Потому что ваш расчет зависит от целого числа оборотов. Наименьшее приращение является diffRotations из 1.

1 × 3600 × 1.8333333/5280 = 1.25

Таким образом, каждый чтение миль/ч будет всегда кратна 1,25, например, 1,25, 2,50, 3,75 и т. Д.

+0

Ах, так как комментарий Александара Топлека выше, вы, ребята, говорите, что это математическая проблема, а не проблема программирования ... Я никогда не был так хорош в математике. lol, спасибо за улов. – EvergreenNRG

+0

Да, это причуда вашей математики, а не проблема с кодом. Извините, кредит Александру. Я не заметил этого комментария, когда я начал свой ответ! –

+0

Спасибо всем вам за ваши быстрые комментарии и ответы. – EvergreenNRG

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