如何解决使用 floorf 与 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 );
假设这些值总是严格为正的。
通常您会将行数转换为整数,但由于您使用它计算 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
或天花板
ceil ( 4.7 ) = 5.0
在这里请注意,由于您使用了更多行,因此高度将为
100 / 5 = 20
像素。因此,如果您希望的 21 是最大值,那么您将在此特定示例中使用 ceil
。如果它是最小值,同样你会使用 floor
。
有时你可能会得到有趣和意想不到的值,比如
100 / 20 = 4.999999999
这就是为什么我要增加一点宽容度。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。