Je plaisantais avec stocker float
s et double
en utilisant NSUserDefaults
pour une utilisation dans une application iPhone, et je suis tombé sur quelques incohérences dans la façon dont la précision fonctionne avec eux, et comment j'ai compris que ça fonctionne .Objective-C Float/Double précision
Cela fonctionne exactement comme je me suis dit:
{
NSString *key = @"OneLastKey";
[PPrefs setFloat:235.1f forKey:key];
GHAssertFalse([PPrefs getFloatForKey:key] == 235.1, @"");
[PPrefs removeObjectForKey:key];
}
Cependant, celui-ci ne fonctionne pas:
{
NSString *key = @"SomeDoubleKey";
[PPrefs setDouble:234.32 forKey:key];
GHAssertEquals([PPrefs getDoubleForKey:key], 234.32, @"");
[PPrefs removeObjectForKey:key];
}
C'est la sortie GHUnit me donne:
'234.320007324' should be equal to '234.32'.
Mais, si je jette d'abord le double à un 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 sous l'hypothèse que les chiffres sont entrés sans « f » à la fin étaient déjà considérés double
s. Est-ce incorrect? Si oui, pourquoi est-ce que le casting vers un float
puis double
fonctionne correctement?