Потеря точности преобразования 'float' в NSNumber, обратно в 'float'

Кажется, я столкнулся со странной проблемой в Objective-C, преобразовывая float в NSNumber (оборачивая его для удобства), а затем конвертируя обратно в float.

Вкратце, мой класс имеет свойство red , которое является плавающим от 0,0 до 1,0 :

@property (nonatomic, assign) float red;

Этот объект сравнивает Само значение, которое загружается с диска, для целей синхронизации. (Файл может изменяться вне приложения, поэтому он периодически проверяет наличие изменений в файле, загружает альтернативную версию в память и выполняет сравнение, объединяя различия.)

Вот интересный фрагмент, в котором сравниваются два значения:

if (localObject.red != remoteObject.red) {
    NSLog(@"Local red: %f Remote red: %f", localObject.red, remoteObject.red);
}

Вот что я вижу в журналах:

2011-10-28 21:07:02.356 MyApp[12826:aa63] Local red: 0.205837 Remote red: 0.205837

Странно. Верно? Как выполняется этот фрагмент кода?

Фактическое значение, хранящееся в файле:

...red="0.205837"...

Преобразуется в float с использованием:

currentObject.red = [[attributeDict valueForKey:@"red"] floatValue];

В другом месте кода I удалось зацепить скриншот из GDB. Он был напечатан в NSLog как: (Это также точность, с которой он отображается в файле на диске.)

2011-10-28 21:21:19.894 MyApp[13214:1c03] Local red: 0.707199 Remote red: 0.707199

Но отображается в отладчике как:

GDB Screenshot

Как достигается такой уровень точности на уровне свойств, но не хранится в файле или правильно печатается в NSLog? И почему это кажется разным?

9
задан mskfisher 11 May 2012 в 13:36
поделиться