Objective-C Float / Double precision
-
29-10-2019 - |
Domanda
Sono stato nei guai con la memorizzazione float
s e double
s utilizzando NSUserDefaults
per l'utilizzo in un'applicazione per iPhone, e mi sono imbattuto in alcune incongruenze in quanto i lavori di precisione con loro, e come ho capito funziona.
Questo funziona esattamente come ho pensato:
{
NSString *key = @"OneLastKey";
[PPrefs setFloat:235.1f forKey:key];
GHAssertFalse([PPrefs getFloatForKey:key] == 235.1, @"");
[PPrefs removeObjectForKey:key];
}
Tuttavia, questo non ha:
{
NSString *key = @"SomeDoubleKey";
[PPrefs setDouble:234.32 forKey:key];
GHAssertEquals([PPrefs getDoubleForKey:key], 234.32, @"");
[PPrefs removeObjectForKey:key];
}
Questo è l'output GHUnit mi dà:
'234.320007324' should be equal to '234.32'.
Ma, se ho gettato il doppio per un float
, e quindi per un double
funziona senza errori:
{
NSString *key = @"SomeDoubleKey";
[PPrefs setDouble:234.32 forKey:key];
GHAssertEquals([PPrefs getDoubleForKey:key], (double)(float)234.32, @"");
[PPrefs removeObjectForKey:key];
}
Ero sotto l'ipotesi che i numeri inseriti senza una 'f', alla fine sono stati già considerati double
s.Questo è errato?Se è così, perché il casting per un float
e poi double
funziona correttamente?
Soluzione
Risolto!Si scopre che i miei quadro metodo +(void)setDouble:(double)value forKey:(NSString*)key
è stato definito, in realtà, come +(void)setDouble:(
float
)value forKey:(NSString*)key
.Il valore passato era un doppio, ma è stato convertito in float per l'uso nel metodo.Un semplice copia e incolla problema.Peccato che l'Objective-C, il compilatore non ha almeno lanciare un avvertimento come sembra fare per tutto il resto...