При использовании двойного или плавающего типа данных в приложении iPhone я столкнулся с проблемами с сравнениями " > =" и "< =", потому что, когда переменной присваивается номер, введенный с одним десятичным знаком, таким как 4.2, float или double, используемые в сравнении, фактически могут иметь значение, такое как 4.1999998092651367. Из-за этого различия сравнение, такое как " >= 4.2", является ложным вместо истинного. Как я могу избежать этой проблемы?
Сравнение поплавковых и двойных типов данных в объекте C
Ответ 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
, чтобы сделать их одинарной точностью.
(Это также может повысить производительность, но это не причина для этого, причина в том, что это сделает ваш код более правильным).