从另一个NSNumber行为创建NSNumber?

时间:2012-01-09 21:48:27

标签: objective-c floating-point nsarray nsnumber

我正在尝试将NSNumber作为浮点值插入到NSArray中,其中包含来自另一个NSNumber的floatValue。我能够很好地创建数组,但是当我访问该对象时,它似乎只是一个整数?我希望[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指针,当我尝试在NSLog中使用%f指针时,应用程序完全崩溃。这里发生了什么?这个问题比任何事情都更具学术性。

2 个答案:

答案 0 :(得分:3)

NSNumber的默认打印行为将删除任何前导零。因此,即使底层值是浮点数,如果没有实际的非零浮点数,它也会像整数一样打印。

关于第二个问题,在日志语句中同时使用%i%f是不正确的,因为您正在记录对象。如果您愿意,可以使用%p来记录对象的指针值,但我认为此刻对您没有用。如果你想使用%f来获得printf的默认浮动打印行为,那么你需要实际传递一个浮点而不是一个对象,就像在NSLog(@"%f", [[arr objectAtIndex:0] floatValue])中一样。

如果您真正感兴趣的是NSNumber是否在内部存储了一个浮点数,那么您可以打印出-objcType方法的结果,这将为您提供@encode } -string用于底层值,但我不确定为什么你关心特定底层格式NSNumber用来存储你的值,只要它能以你想要的格式返回你的值(例如通过调用{ {1}})。

答案 1 :(得分:1)

在最后一行尝试这个:

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