【问题标题】: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,此处无需使用整数。 (请注意,如果您正在观看,CGFloat 是 float,所以您可能想使用 floorf,但在许多架构上的 FWIW floor 和 floorf 是一回事。
不确定这是否是困扰您的问题,但 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
这就是为什么我要添加一点宽容。