0

我对我今天的经历感到非常困惑。我正在计算单元格高度。

这是代码:

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”代表什么以及它的作用。

4

3 回答 3

2

它告诉计算机这是一个浮点数。如果数字后面没有 f,则认为它是双精度数或整数(取决于是否有小数)。

20.0f -> float
20.0 -> double
20 -> integer
于 2012-09-13T20:02:45.303 回答
2

嗯,这真的很奇怪,因为根据定义,C 将浮点数作为双精度值传递到堆栈上,并且由于 ObjC 方法变成了 C 函数,即使使用浮点数参数,浮点数也被扩展为双精度数。话虽如此,编译器可能会将 17.0 放入浮点数,然后将其扩展为双精度数,并且不知何故 iOS 正在查看该确切的二进制数(比较它),而如果您直接传递双精度数,则略有不同并最终成为分数字体。

所以我很好奇并决定尝试一个测试:

- (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

数字完全相同,与十六进制相同。您的代码中的其他地方显然有问题。

于 2012-09-13T20:04:25.980 回答
1

f 后缀只是告诉编译器哪个是浮点数,哪个是双精度数。如果没有“f”,所有计算都将具有双精度。

1.0f 浮动

1.0 双

于 2012-09-13T19:52:44.770 回答