[英]Using floorf vs floor
我的代码中有以下情况:
//maxiumumHeight and rowHeight are CGFloats
CGFloat rows = floorf(maximumHeight / rowHeight);
CGFloat height = (rows * rowHeight);
它工作得很好,但我注意到当我使用floor
时,它也工作得很好。 我也对如何定义rows
感到困惑,它应该是NSUInteger
还是CGFloat
?
它似乎在所有情况下都可以正常工作,但是我在理解浮点数学时遇到了一些麻烦,并且想知道执行此代码的最佳方法是什么? 还是有关系?
floor
用于double
(与CGFloat
相同), floorf
用于float
(意味着它需要float
参数)。 这来自 ol' C 的东西。 由于您使用CGFloat
棒与floor
。 但是,以防万一,我会增加一点容忍度,所以将其更改为例如
CGFloat rows = floor ( ( maximumHeight + 0.5 ) / rowHeight );
假设这些值始终严格为正。
通常您会将行数转换为 integer 但由于您使用它计算 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 多一点(因为你使用的行更少)。
如果您想使用 5 行,请使用ceil
或 ceiling ,因为
ceil ( 4.7 ) = 5.0
在这里请注意,由于您使用更多行,因此高度将为
100 / 5 = 20
像素。 因此,如果您希望的 21 是最大值,那么您将在此特定示例中使用ceil
。 如果它是最小值,您同样会使用floor
。
有时你可能会得到有趣和意想不到的值,比如
100 / 20 = 4.999999999
这就是为什么我会增加一点容忍度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.