NSNumber floatValue не равно значению NSNumber - PullRequest
2 голосов
/ 12 мая 2010

Первый пост здесь. Возникла проблема с методом floatValue NSNumber - каким-то образом он возвращает неточное число. Вот проблема: я храню кучу NSNumbers в массиве, например:

NSArray *a = [NSArray arrayWithObjects:
    [NSNumber numberWithFloat:0.04f],
    [NSNumber numberWithFloat:0.028f], 
    [NSNumber numberWithFloat:0.016f],
    [NSNumber numberWithFloat:0.004f],
   nil];

Затем я пытаюсь получить первое значение (например): NSNumber n = (NSNumber ) [a objectAtIndex: 0]; CGFloat f = [n floatValue];

В отладчике n показывает значение 0,04 (в сводной колонке), а f показывает значение 0,0399999991. Что я тут не так делаю?

Спасибо всем.

1 Ответ

2 голосов
/ 12 мая 2010

Вы не делаете ничего плохого. Это не проблема конкретно NSNumber или CGFloat, либо. Это что-то очень универсальное в числах с плавающей запятой, которое основано на степенях 2, а не на десяти. Вы должны прочитать эту категорическую статью или статью Википедии .

Дело в том, что стандартные числа с плавающей запятой могут только точно представлять число, которое является суммой 1/2, 1/4, 1/8, .... 1/10 нет. Таким образом, вы не можете точно представить 0,1, используя стандартные числа с плавающей запятой.

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

...