iPhone - 20.0和20.0f之间的差异

时间:2012-09-13 19:50:44

标签: iphone ios xcode

我对今天的经历感到困惑。我在计算细胞高度。

这是代码:

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”代表什么以及它做了什么。

3 个答案:

答案 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双