2011-03-23 3 views
1

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?

Répondre

4

Résolu! Il s'avère que ma méthode de structure +(void)setDouble:(double)value forKey:(NSString*)key a été définie comme +(void)setDouble:(float)value forKey:(NSString*)key. La valeur transmise était double, mais a été convertie en un flottant pour une utilisation dans la méthode. Un simple copier-coller. Dommage que le compilateur Objective-C n'ait pas au moins lancé un avertissement comme il semble le faire pour tout le reste ...