Какао Touch. Почему NSNumber возвращает значение разницы для intValue и floatValue? - PullRequest
2 голосов
/ 11 марта 2010

Хорошо, это абсолютно бессмысленно:

Я создал NSNumber:

NSNumber *n = [NSNumber numberWithInt:37669178];  

Затем я отображаю значение как целое число и число с плавающей запятой:

int i = [n intValue];  
float f = [n floatValue];

Вот их значения:

int: 37669178  
float: 37669176.000000

Ха!?!?!

Может кто-нибудь объяснить мне, почему это происходит и как обойти это. Это, конечно, не может быть проблемой точности. 37 669 178 находятся в пределах точности поплавка.

Спасибо
Дуг

UPDATE

ОК, теперь я в полном замешательстве. Ссылаясь на math.h

#define MAXFLOAT    ((float)3.40282346638528860e+38)

Целочисленное значение 37669178 равно 3,7669178e + 7, что находится в пределах максимально допустимого значения с плавающей запятой. Итак, [n floatValue] должно вернуть 37669178.0 , а не 37669176.0

Что мне здесь не хватает?

Ответы [ 2 ]

8 голосов
/ 11 марта 2010

Число с плавающей запятой имеет только 23 бита точности (не путать с диапазон ), что составляет около 7 значащих десятичных цифр. Используйте double, если вам нужна большая точность, чем эта.

Что каждый программист должен знать о плавающей точке

0 голосов
/ 11 марта 2010

Связанный с предметом под рукой: NSNumber не предназначен для выполнения точных математических операций с. Это просто способ обернуть число в объект. Если вам нужна точность, вы должны использовать вместо этого NSDecimal.

...