繁体   English   中英

使用 floorf 与 floor

[英]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此处无需使用整数。 (请注意,如果您正在观看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 多一点(因为你使用的行更少)。

如果您想使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM