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

При использовании двойного или плавающего типа данных в приложении iPhone у меня возникают проблемы с сравнениями «> =» и « = 4.2», является ложным вместо истинного. Как я могу избежать этой проблемы?

когда переменной присваивается номер, введенный с одним десятичным знаком, например 4.2, поплавок или двойник, используемые в сравнении, фактически могут иметь значение, такое как 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 чтобы сделать их одинарной точностью.

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

  • Преобразовать float в строку с заданной точностью и количеством десятичных цифр?
  • Форматирование удваивается для вывода в C #
  • Алгоритм преобразования двоичного кода IEEE 754 в строку?
  • Сколько двойных чисел существует между 0.0 и 1.0?
  • Что означают F и D в конце числовых литералов?
  • Почему значение с плавающей запятой, такое как 3.14, по умолчанию считается в MSVC?
  • Как мне сделать сравнение с плавающей запятой?
  • Как разобрать строку на float или int в Python?
  • Типы с плавающей запятой с фиксированным размером
  • Сравнение числа с плавающей точкой с нолем
  • Как преобразовать целое число в float в Java?
  • Давайте будем гением компьютера.