Подтвердить что ты не робот

Сравнение поплавковых и двойных типов данных в объекте C

При использовании двойного или плавающего типа данных в приложении iPhone я столкнулся с проблемами с сравнениями " > =" и "< =", потому что, когда переменной присваивается номер, введенный с одним десятичным знаком, таким как 4.2, float или double, используемые в сравнении, фактически могут иметь значение, такое как 4.1999998092651367. Из-за этого различия сравнение, такое как " >= 4.2", является ложным вместо истинного. Как я могу избежать этой проблемы?

4b9b3361

Ответ 1

когда переменной присваивается число, введенное с одним десятичным знаком, например 4.2, float или double, используемые в сравнении, фактически могут иметь значение, такое как 4.1999998092651367

Не могу. будет. Конкретно:

float f = 4.2;  // f is exactly 4.19999980926513671875
double d = 4.2; // d is exactly 4.20000000000000017763568394002504646778106689453125

Проблема возникает, когда вы пишете что-то вроде:

float f = 4.2;
if (f >= 4.2) {
    // this block of code is not executed.
}

f - это точно 4.19999980926513671875, но вы сравниваете его с литералом с двойной точностью "4.2", который имеет значение 4.20000000000000017763568394002504646778106689453125, поэтому сравнение не выполняется. Если вместо этого вы сравните с единственным литометром точности "4.2f":

float f = 4.2;
if (f >= 4.2f) {
    // this block of code is exectued.
}

сравнение выполняется успешно, так как значения точно равны. Плавающая точка сложна, но она полностью детерминирована; одна из простейших вещей, которую вы можете сделать, чтобы сделать ее более интуитивной, - это не смешивать оценки. Если вы работаете с float, убедитесь, что все ваши литералы имеют суффикс f, чтобы сделать их одинарной точностью.

(Это также может повысить производительность, но это не причина для этого, причина в том, что это сделает ваш код более правильным).