2016-01-05 4 views
-1

Новичок в C#, пытаясь разработать простой расчет.modulo function

float old x=300 
float Distance=300 
float pitch=0.8 
int sign=1 

new x= old x - (sign * (Distance % pitch) * 0.5 f)

Значения сгенерирована программой для новых й является 299.6 (который я не понимаю).

Значение для (Distance % pitch): 0.7999955. При вычислении вручную 300 modulo 0.8 - 0. Я предполагаю, что функция modulo ведет себя по-разному для значений float, но я не знаю, как это сделать. Или он рассчитан как 300 процентов от 0,8?

Пояснение по этому вопросу будет высоко оценено.

+0

См http://stackoverflow.com/questions/20671518 –

+0

Это типичная проблема с числами с плавающей точкой .. , –

ответ

1

Никогда не ожидайте вычисления с двоичными числами с плавающей запятой (с использованием float или double) с десятичными значениями с плавающей запятой (например, 0.8), чтобы дать точные результаты.

Проблема в том, что большая часть десятичных чисел не может быть представлена ​​точно в двоичном формате с плавающей запятой. Вы можете думать об этом как о попытке представить 1/3 в десятичной системе обозначений. Это невозможно.

В вашем случае 0.8f на самом деле не 0.8. Если вы приводите значение для double, чтобы получить дополнительную точность, вы увидите, что ближе к 0.800000011920929

float pitch = 0.8f; 
Console.WriteLine((double)pitch); // prints 0.800000011920929