Вопрос

Первый пост здесь.Возникла проблема с методом 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, используя стандартные числа с плавающей запятой.

Если вам действительно нужно с этим разобраться, существуют процедуры, которые работают с рациональными дробями или десятичными числами с плавающей запятой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top