Objective-C Float / Двойная точность - PullRequest
1 голос
/ 23 марта 2011

Я возился с хранением float s и double s, используя NSUserDefaults для использования в приложении iPhone, и я столкнулся с некоторыми несоответствиями в том, как точность работает с ними, и как я понял, как это работает.

Это работает точно так, как я рассчитывал:

{
    NSString *key = @"OneLastKey";
    [PPrefs setFloat:235.1f forKey:key];
    GHAssertFalse([PPrefs getFloatForKey:key] == 235.1, @"");
    [PPrefs removeObjectForKey:key];
}

Однако это не так:

{
    NSString *key = @"SomeDoubleKey";
    [PPrefs setDouble:234.32 forKey:key];
    GHAssertEquals([PPrefs getDoubleForKey:key], 234.32, @"");
    [PPrefs removeObjectForKey:key];
}

Это вывод, который GHUnit дает мне:

'234.320007324' should be equal to '234.32'. 

Но, если я сначала приведу двойное число к float, а затем к double, то оно будет работать без сбоев:

{
    NSString *key = @"SomeDoubleKey";
    [PPrefs setDouble:234.32 forKey:key];
    GHAssertEquals([PPrefs getDoubleForKey:key], (double)(float)234.32, @"");
    [PPrefs removeObjectForKey:key];
}

Я предполагал, что числа вводятся без'f' в конце уже считались double с.Это неверно?Если так, почему приведение к float и затем double работает правильно?

1 Ответ

4 голосов
/ 23 марта 2011

Решено! Оказывается, мой каркасный метод +(void)setDouble:(double)value forKey:(NSString*)key был фактически определен как +(void)setDouble:(float)value forKey:(NSString*)key. Переданное значение было двойным, но было преобразовано в число с плавающей точкой для использования в методе. Простая проблема копирования и вставки. Жаль, что компилятор Objective-C, по крайней мере, не выдал предупреждение, как кажется, для всего остального ...

...