【问题标题】:Using floorf vs floor使用 floorf 与 floor
【发布时间】:2021-08-04 22:29:49
【问题描述】:

我的代码中有以下情况:

//maxiumumHeight and rowHeight are CGFloats
CGFloat rows = floorf(maximumHeight / rowHeight);
CGFloat height = (rows * rowHeight);

它工作得很好,但我注意到当我使用floor 时,它也工作得很好。我也很困惑如何定义rows,应该是NSUInteger 还是CGFloat

它似乎在所有情况下都可以正常工作,但是我在理解浮点数学时遇到了一些麻烦,并且想知道执行此代码的最佳方法是什么?还是有关系?

【问题讨论】:

    标签: ios objective-c floor cgfloat floor-division


    【解决方案1】:

    floor 用于double(与CGFloat 相同),floorf 用于float(意味着它需要float 参数)。这来自 ol' C 的东西。由于您使用CGFloat,因此请坚持使用floor。但是,以防万一,我会增加一点容忍度,所以将其更改为例如

    CGFloat rows = floor ( ( maximumHeight + 0.5 ) / rowHeight );
    

    假设这些值总是严格正数。

    您通常会将行数转换为整数,但由于您使用它来计算 UI 高度,它也将用作CGFloat,此处无需使用整数。 (请注意,如果您正在观看,CGFloatfloat,所以您可能想使用 floorf,但在许多架构上的 FWIW floorfloorf 是一回事。

    不确定这是否是困扰您的问题,但 floor 会向下舍入到最接近的 int。所以如果你有例如100 像素可用,而您希望一行有 20 像素,您将拥有

    100 / 20 = 5
    

    行。如果你希望它是 21 像素怎么办?那么

    100 / 21 = 4.76
    

    现在您需要做出决定。如果要在此处插入 4 行,请使用 floor,因为

    floor ( 4.7 ) = 4.0
    

    请注意,由于您仅使用 4 行,因此每行的高度将为

    100 / 4 = 25
    

    像素,比您希望的 21 行多一点(因为您使用 less 行)。

    如果您想使用 5 行,那么请使用 ceil 或上限,因为

    ceil ( 4.7 ) = 5.0
    

    请注意,由于您使用 更多 行,因此高度将为

    100 / 5 = 20
    

    像素。因此,如果您希望的 21 是 最大值,则在此特定示例中您将使用 ceil。如果它是最小值,您同样会使用floor

    有时你可能会得到有趣和意想不到的值,比如

    100 / 20 = 4.999999999
    

    这就是为什么我要添加一点宽容。

    【讨论】:

      猜你喜欢
      • 2017-04-13
      • 2015-02-27
      • 2011-01-22
      • 2019-07-04
      • 1970-01-01
      • 2017-02-19
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多