Question

Je jouais avec le stockage floatle sable doubles 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 doubles. Est-ce incorrect? Si oui, pourquoi le jet à un float et alors double travailler correctement?

Était-ce utile?

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 ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top