Кажется, я столкнулся со странной проблемой в Objective-C: преобразовать число с плавающей точкой в NSNumber (обернуть его для удобства) и затем преобразовать его обратно в число с плавающей точкой.
В двух словах, мой классимеет свойство 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];
В другой точке кода я смог получить скриншот из GDB.Он был распечатан в NSLog как: (Это также точность, с которой он появляется в файле на диске.)
2011-10-28 21:21:19.894 MyApp[13214:1c03] Local red: 0.707199 Remote red: 0.707199
Но в отладчике он выглядит как:
Как этот уровень точности получается на уровне свойств, но не сохраняется в файле или печатается должным образом в NSLog? А почему оно кажется разным?