1

我的代码中有以下情况:

//maxiumumHeight and rowHeight are CGFloats
CGFloat rows = floorf(maximumHeight / rowHeight);
CGFloat height = (rows * rowHeight);

它工作得很好,但我注意到当我使用时floor,它也工作得很好。我也对如何定义感到困惑rows,它应该是NSUIntegerorCGFloat吗?

它似乎在所有情况下都可以正常工作,但是我在理解浮点数学时遇到了一些麻烦,并且想知道执行此代码的最佳方法是什么?还是有关系?

4

1 回答 1

1

flooris for double(与 相同CGFloat)和floorfis for float(意味着它需要float参数)。这来自 ol' C 的东西。由于您使用CGFloat坚持使用floor. 但是,以防万一,我会增加一点容忍度,所以将其更改为例如

CGFloat rows = floor ( ( maximumHeight + 0.5 ) / rowHeight );

假设这些值始终严格为正。

通常,您会将行数转换为整数,但由于您使用它计算 UI 高度,因此也将使用它,因为CGFloat此处无需使用整数。(请注意,如果您正在观看CGFloatfloat那么您会想要使用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 行,则使用ceilor 天花板,因为

ceil ( 4.7 ) = 5.0

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

100 / 5 = 20

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

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

100 / 20 = 4.999999999

这就是为什么我会增加一点容忍度。

于 2021-05-15T09:50:40.077 回答