Pregunta

primer post aquí. Tener un problema con el método de floatValue NSNumber - de alguna manera, devuelve un número impreciso. Aquí está el problema: guardo un montón de NSNumbers en una matriz, como esto:

NSArray *a = [NSArray arrayWithObjects:
    [NSNumber numberWithFloat:0.04f],
    [NSNumber numberWithFloat:0.028f], 
    [NSNumber numberWithFloat:0.016f],
    [NSNumber numberWithFloat:0.004f],
   nil];

A continuación, trato de recuperar el primer valor (por ejemplo): NSNumber n = (NSNumber ) [a objectAtIndex: 0]; CGFloat f = [n floatValue];

En el depurador, n muestra un valor de 0,04 (en la columna resumen), pero F muestra un valor de 0,0399999991. ¿Qué estoy haciendo mal aquí?

Gracias a todos.

¿Fue útil?

Solución

No estamos haciendo mal nada. Eso no es un problema específicamente de NSNumber o CGFloat, tampoco. Es algo muy universal en los números de punto flotante, que se basa en potencias de 2, no potencias de diez. Debe leer este artículo definitiva o artículo de Wikipedia .

El punto es, los números estándar de punto flotante sólo se pueden representar con precisión un número que es una suma de 1/2, 1/4, 1/8, .... 1/10 no lo es. Así no se puede representar con precisión por completo 0,1 utilizando números de punto flotante estándar.

Si realmente necesidad de tratar con él, hay rutinas que se ocupan de las fracciones racionales o números de coma flotante decimal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top