Objectif-C flottant / double précision
-
29-10-2019 - |
Question
Je jouais avec le stockage float
le sable double
s en utilisant NSUserDefaults
Pour une utilisation dans une application iPhone, et je suis tombé sur des incohérences dans la façon dont la précision fonctionne avec eux et comment je l'ai compris que cela fonctionne.
Cela fonctionne exactement comme je l'ai pensé:
{
NSString *key = @"OneLastKey";
[PPrefs setFloat:235.1f forKey:key];
GHAssertFalse([PPrefs getFloatForKey:key] == 235.1, @"");
[PPrefs removeObjectForKey:key];
}
Cependant, celui-ci ne le fait pas:
{
NSString *key = @"SomeDoubleKey";
[PPrefs setDouble:234.32 forKey:key];
GHAssertEquals([PPrefs getDoubleForKey:key], 234.32, @"");
[PPrefs removeObjectForKey:key];
}
C'est la sortie que Ghunit me donne:
'234.320007324' should be equal to '234.32'.
Mais, si je lance le double pour d'abord float
, puis à un double
Cela fonctionne sans faute:
{
NSString *key = @"SomeDoubleKey";
[PPrefs setDouble:234.32 forKey:key];
GHAssertEquals([PPrefs getDoubleForKey:key], (double)(float)234.32, @"");
[PPrefs removeObjectForKey:key];
}
J'étais en supposant que les nombres entrés sans un «f» à la fin étaient déjà considérés double
s. Est-ce incorrect? Si oui, pourquoi le jet à un float
et alors double
travailler correctement?
La solution
Résolu! Il s'avère que ma méthode framework +(void)setDouble:(double)value forKey:(NSString*)key
était en fait défini comme +(void)setDouble:(
float
)value forKey:(NSString*)key
. La valeur passée a été Un double mais a été converti en flotteur pour une utilisation dans la méthode. Un simple problème de copie et de coller. Dommage que le compilateur Objective-C n'a pas au moins jeté un avertissement comme il semble faire pour tout le reste ...