Objective-C Float / Double precision
-
29-10-2019 - |
Pregunta
Yo jugueteaba con el almacenamiento de float
s y double
s 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 double
s.Es esto correcto?Si es así, ¿por qué casting para un float
y, a continuación, double
funciona correctamente?
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...