doubleValue не всегда правильно преобразовывает объект в двойное значение - PullRequest
2 голосов
/ 02 сентября 2011

У меня есть NSArray, в котором я хотел бы хранить двойные значения. Я определил это следующим образом

NSMutableArray *setOfDoubles;

Я добавляю элементы следующим образом

NSNumber *num;
num = [NSNumber numberWithDouble:someDouble];
[setOfDoubles addObject:num];

И я прочитал элемент следующим образом

num = [setOfDoubles lastObject];  
[setOfDoubles removeLastObject];
doubleValueToUse = [num doubleValue];

Моя проблема иногда (не всегда), например, когда num (как объект) равен 5.1, doubleValueToUse (как двойное значение) равен 5.099999999999996. Я понял, что num (как объект) - это 5.1, это то, что я отлаживаю, и когда я наводю указатель мыши над num на строке num = [setOfDoubles lastObject]; это показывает 5.1, но после преобразования doubleValue это становится числом, которое я упомянул. Кто-нибудь знает, почему это происходит?

Ответы [ 2 ]

4 голосов
/ 02 сентября 2011

Не каждое число может быть точно представлено с помощью переменной с плавающей точкой.Например, вы не можете точно представить, скажем, 1/3, используя конечное число цифр в нашей общей десятичной (основание-10) системе, но в троичной (основание-3) это будет всего 0,1.Точно так же числа, которые вы можете записать с конечным числом цифр в десятичном виде, могут не обязательно иметь конечное число цифр в их двоичном представлении, отсюда и ошибка.

Несколько ссылок по теме, если вам интересно:

http://floating -point-gui.de / basic /

http://www.mathworks.com/support/tech-notes/1100/1108.html

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

1 голос
/ 02 сентября 2011

Это нормально для float значений.

Если вы хотите сохранить начальное (одинаковое) представление чисел float во всех местах вашего кода, вы можете сохранить их, например, в NSString.Когда вам понадобится число с плавающей точкой, вы просто напишите [NSString floatValue];.Но это не эффективно, если у вас большое количество float значений.

...