NSNumber floatValue не равно значению NSNumber
Вопрос
Первый пост здесь.Возникла проблема с методом floatValue NSNumber - каким-то образом он возвращает неточное число.Вот проблема:Я храню кучу NSNumbers в массиве, вот так:
NSArray *a = [NSArray arrayWithObjects:
[NSNumber numberWithFloat:0.04f],
[NSNumber numberWithFloat:0.028f],
[NSNumber numberWithFloat:0.016f],
[NSNumber numberWithFloat:0.004f],
nil];
Затем я пытаюсь получить первое значение (например):НСномер n = (NSNumber) [объектАтИндекс:0];CGFloat f = [n floatValue];
В отладчике n показывает значение 0,04 (в столбце сводки), а f — значение 0,0399999991.Что я здесь делаю не так?
Всем спасибо.
Решение
Вы не делаете ничего плохого.Это не проблема конкретно NSNumber
или CGFloat
, или.В числах с плавающей запятой есть что-то очень универсальное, основанное на степени двойки, а не степени десяти.Вам следует прочитать эта исчерпывающая статья или Статья в Википедии.
Дело в том, что стандартные числа с плавающей запятой могут точно представлять только число, которое представляет собой сумму 1/2, 1/4, 1/8,....1/10 нет.Таким образом, вы не можете полностью точно представить 0,1, используя стандартные числа с плавающей запятой.
Если вам действительно нужно с этим разобраться, существуют процедуры, которые работают с рациональными дробями или десятичными числами с плавающей запятой.