我对今天的经历感到困惑。我在计算细胞高度。
这是代码:
float height = [text sizeWithFont:[UIFont systemFontOfSize:17.0f] constrainedToSize:CGSizeMake(300 - width - 20.0, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap].height;
现在问题是,当我将... systemFontOfSize: 17.0f 更改为... systemFontOfSize: 17.0 时,所以没有“f”它会计算错误高度。
我的问题更多的是关于这个“f”代表什么以及它做了什么。
答案 0 :(得分:2)
它告诉计算机这是一个浮点数。如果数字后面没有f,则认为它是一个整数或整数(取决于是否有小数)。
20.0f -> float
20.0 -> double
20 -> integer
答案 1 :(得分:2)
嗯,这真是奇怪,因为根据定义,C将浮点数作为堆栈的双精度传递,并且由于ObjC方法变为C函数,即使使用float参数,float也会扩展为double。所有这一切,它可能编译器将17.0放入浮点数,然后将其扩展为double,并且某种程度上iOS正在查看那个确切的二进制数(比较它),而如果你直接传递一个double,它会略有不同并以小数字体结束。
所以我很好奇,决定尝试一下:
- (void)test:(float)foo
{
union {
float f;
uint32_t u;
} u;
u.f = foo;
NSLog(@"foo=%.15f hex=%x", u.f, u.u);
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self test:17.0];
[self test:17.0f];
输出:
2012-09-13 16:02:34.035 Searcher[73472:f803] foo=17.000000000000000 hex=41880000
2012-09-13 16:02:34.036 Searcher[73472:f803] foo=17.000000000000000 hex=41880000
数字完全相同,与十六进制相同。你的代码中的某些地方显然有问题。
答案 2 :(得分:1)
f后缀只是告诉编译器哪个是float,哪个是double。没有'f',所有计算都将具有双精度。
1.0f float
1.0双