Вычитание из CGFloat

NSLog(@"original float value = %f", [anNSNumber floatValue]);
                 
float newFloat = [anNSNumber floatValue] - 1.0f;
                 
NSLog(@"newFloat = %f", newFloat);

Дает мне

исходное значение с плавающей запятой = 215987480044765184.000000

новыйFloat = 215987480044765184.000000

Как просто вычесть 1 из float?


person daihovey    schedule 22.06.2012    source источник


Ответы (2)


Нет, вы не можете упростить его дальше. Число с плавающей запятой отличается от целого числа.

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

Проблема не устраняется, даже если вы выполняете операцию в double, так как число даже превышает 53-битную точность для double.

В зависимости от ваших требований вам может понадобиться 64-битный целочисленный тип (тип long long или более конкретный int64_t). Если такая точность необходима для еще большего числа, базового типа будет недостаточно. Внешняя библиотека может понадобиться, если вам нужна очень высокая точность.

person nhahtdh    schedule 22.06.2012
comment
Однажды я пойму, что такое поплавки. Спасибо, сейчас попробую целые числа. - person daihovey; 22.06.2012
comment
Ах, целые слишком малы. - person daihovey; 22.06.2012
comment
Так как же вычесть 1 из большого NSNumber? - person daihovey; 22.06.2012
comment
@daidai: используйте longLongValue, чтобы получить 64-битное число из NSNumber, и назначьте его переменной long long или int64_t (сделайте ее беззнаковой, если это какой-то идентификатор: unsigned long long и uint64_t), затем работайте с переменной, как вы будет с целым числом. - person nhahtdh; 22.06.2012

Почему у вас в 3-й строке: NSLog(@"newFloat = %f", idOfLastTweet); вместо NSLog(@"newFloat = %f", newFloat); ?

person inwit    schedule 22.06.2012
comment
Измененный. Это для Twitter, но я хотел сделать пример более общим. - person daihovey; 22.06.2012