Pregunta

Yo jugueteaba con el almacenamiento de floats y doubles usando NSUserDefaults para su uso en una aplicación para iPhone, y me encontré con algunas inconsistencias en la forma de la precisión que trabaja con ellos, y lo que yo entendí es que funciona.

Esto funciona exactamente como pensé:

{
    NSString *key = @"OneLastKey";
    [PPrefs setFloat:235.1f forKey:key];
    GHAssertFalse([PPrefs getFloatForKey:key] == 235.1, @"");
    [PPrefs removeObjectForKey:key];
}

Sin embargo, este no:

{
    NSString *key = @"SomeDoubleKey";
    [PPrefs setDouble:234.32 forKey:key];
    GHAssertEquals([PPrefs getDoubleForKey:key], 234.32, @"");
    [PPrefs removeObjectForKey:key];
}

Este es el resultado GHUnit me da:

'234.320007324' should be equal to '234.32'. 

Pero, si yo el primero en arrojar la doble a float, y , a continuación, a un double funciona sin fallar:

{
    NSString *key = @"SomeDoubleKey";
    [PPrefs setDouble:234.32 forKey:key];
    GHAssertEquals([PPrefs getDoubleForKey:key], (double)(float)234.32, @"");
    [PPrefs removeObjectForKey:key];
}

Yo estaba bajo la suposición de que los números introducidos sin una 'f' en la final ya estaban consideradas doubles.Es esto correcto?Si es así, ¿por qué casting para un float y, a continuación, double funciona correctamente?

¿Fue útil?

Solución

¡Resuelto!Resulta que mi método marco +(void)setDouble:(double)value forKey:(NSString*)key En realidad fue definido como +(void)setDouble:(float)value forKey:(NSString*)key.El valor pasado era un doble pero se convirtió en un flotante para su uso en el método.Una simple cuestión de copiar y pegar.Lástima que el compilador de Objective-C no arrojó al menos una advertencia como parece hacerlo con todo lo demás...

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