Comparación de tipos de datos flotantes y dobles en el objetivo C

Comparación de tipos de datos flotantes y dobles en el objetivo C


Cuando uso el tipo de datos doble o flotante en una aplicación de iPhone, tengo problemas con las comparaciones ">=" y "<=" porque cuando se asigna un número a una variable ingresado con un lugar decimal, como 4.2, el flotante o el doble utilizado en la comparación en realidad puede tener un valor como 4.1999998092651367. Debido a esta diferencia, una comparación como ">=4.2" es falsa en lugar de verdadera. ¿Cómo puedo evitar este problema?


Respuestas:



No puede . voluntad . Para ser específicos:


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

El problema viene cuando escribes algo como:


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

f es exactamente 4.19999980926513671875 , pero lo está comparando con el literal de doble precisión "4.2", que tiene el valor 4.20000000000000017763568394002504646778106689453125 , por lo que la comparación falla. Si, en cambio, compara con el literal de precisión simple "4.2f":


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

la comparación tiene éxito, porque los valores son exactamente iguales. El punto flotante es complicado, pero es completamente determinista; una de las cosas más simples que puede hacer para que sea más intuitivo es no mezclar precisiones. Si está trabajando con float , asegúrese de que todos sus literales tengan el sufijo f para hacerlos también de precisión simple.


(Esto también puede mejorar el rendimiento, pero esa no es la razón para hacerlo; la razón para hacerlo es porque hará que su código sea más correcto).