使用 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,因此无需在此处使用整数。 (请注意,如果您正在监视 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 或天花板

ceil ( 4.7 ) = 5.0

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

100 / 5 = 20

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

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

100 / 20 = 4.999999999

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...