Создание NSNumber из другого поведения NSNumber? - PullRequest
0 голосов
/ 10 января 2012

Я пытаюсь вставить NSNumber в качестве значения с плавающей точкой в ​​NSArray, содержащий floatValue из другого NSNumber. Я могу создать массив нормально, но когда я получаю доступ к объекту, он кажется только целым числом? Я ожидал бы, что [NSNumber numberWithFloat: n] сгенерирует нормальный NSNumber со значением с плавающей запятой ..

int myInteger = 3;
NSNumber *myNum = [NSNumber numberWithInt:myInteger];
NSArray *arr = [NSArray arrayWithObjects:[NSNumber numberWithFloat:[myNum floatValue]], nil];
NSLog(@"%@", [arr objectAtIndex:0]);

Выход:

2012-01-09 16:39:32.664 ObjectiveCSandbox[2961:707] 3

Кроме того, я могу нормально использовать указатель% i, и когда я пытаюсь использовать указатель% f в NSLog, приложение полностью падает. Что здесь происходит? Этот вопрос более академичен, чем что-либо.

Ответы [ 2 ]

3 голосов
/ 10 января 2012

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

Что касается вашего второго вопроса, то использование %i и %f неверно в вашей записи журнала, так как вы регистрируете объект. Вы можете использовать %p для записи значения указателя объекта, если хотите, но я не думаю, что это полезно для вас в данный момент. Если вы хотите использовать %f, чтобы получить стандартное поведение печати с плавающей точкой в ​​printf, тогда вам нужно фактически передать ему float вместо объекта, как в NSLog(@"%f", [[arr objectAtIndex:0] floatValue]).

Если все, что вас действительно интересует, это то, хранит ли NSNumber внутреннее число с плавающей запятой, вы можете распечатать результаты метода -objcType, который даст вам строку @encode для базового значение, но я не уверен, почему вас волнует, какой конкретный базовый формат NSNumber используется для хранения вашего значения, если он может вернуть вам значение в нужном формате (например, путем вызова -floatValue).

1 голос
/ 10 января 2012

Попробуйте это для последней строки:

NSLog(@"%f", [[arr objectAtIndex:0] floatValue]);
...