我正在尝试将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指针时,应用程序完全崩溃。这里发生了什么?这个问题比任何事情都更具学术性。
答案 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]);