Кажется, я столкнулся со странной проблемой в 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
Но отображается в отладчике как:
Как достигается такой уровень точности на уровне свойств, но не хранится в файле или правильно печатается в NSLog? И почему это кажется разным?