我的代码中有以下情况:
//maxiumumHeight and rowHeight are CGFloats
CGFloat rows = floorf(maximumHeight / rowHeight);
CGFloat height = (rows * rowHeight);它工作得很好,但我注意到当我使用floor时,它也工作得很好。我也不知道如何定义rows,它应该是NSUInteger还是CGFloat
它似乎在所有场景下都工作得很好,但我在理解浮点数学方面有一点困难,我想知道做这段代码的最佳方式是什么?或者这有关系吗?
发布于 2021-05-15 17:50:40
floor用于double (与CGFloat相同),floorf用于float (意味着它接受float参数)。这是老生常谈的东西。由于您在floor中使用CGFloat stick。但是,以防万一,我会添加一点容差,因此将其更改为例如。
CGFloat rows = floor ( ( maximumHeight + 0.5 ) / rowHeight );假设这些值始终是严格的正数。
通常您会将行数转换为整数,但由于您使用它计算UI高度,因此这里不需要使用整数,因为它也将用作CGFloat。(请注意,如果你正在观察,CGFloat是float,所以你会想要使用floorf,但是在许多架构上,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这就是为什么我要加一点忍耐力。
https://stackoverflow.com/questions/67539565
复制相似问题