Ios 使用地板与地板

Ios 使用地板与地板,ios,objective-c,floor,cgfloat,floor-division,Ios,Objective C,Floor,Cgfloat,Floor Division,我的代码中有以下情况: //maxiumumHeight and rowHeight are CGFloats CGFloat rows = floorf(maximumHeight / rowHeight); CGFloat height = (rows * rowHeight); 它工作得很好,但我注意到当我使用floor时,它也工作得很好。我还不知道如何定义行,它应该是NSUInteger还是CGFloat 它似乎在所有情况下都能正常工作,但我在理解浮点数学方面有点困难,我想知道执行此代

我的代码中有以下情况:

//maxiumumHeight and rowHeight are CGFloats
CGFloat rows = floorf(maximumHeight / rowHeight);
CGFloat height = (rows * rowHeight);
它工作得很好,但我注意到当我使用
floor
时,它也工作得很好。我还不知道如何定义
,它应该是
NSUInteger
还是
CGFloat


它似乎在所有情况下都能正常工作,但我在理解浮点数学方面有点困难,我想知道执行此代码的最佳方式是什么?或者这有关系吗?

floor
表示
double
(与
CGFloat
相同),
floorf
表示
float
(表示它采用
float
参数)。这是ol'C的东西。因为您使用的是
CGFloat
所以请坚持使用
floor
。但是,以防万一,我会增加一点容忍度,所以将其更改为例如

CGFloat rows = floor ( ( maximumHeight + 0.5 ) / rowHeight );
假设这些值始终严格为正值

通常,您会将行数转换为整数,但由于使用它计算UI高度,因此也将用作
CGFloat
此处无需使用整数。(请注意,如果您在值班
CGFloat
float
,那么您可能希望在那里使用
floorf
,但在许多体系结构
floor
floorf
上的FWIW是同一个)

不确定这是否是困扰您的问题,但地板四舍五入到最接近的整数。因此,如果您有例如100个像素可用,并且您希望一行有20个像素,您将有

100 / 20 = 5
排。如果你希望它是21像素呢?然后

100 / 21 = 4.76
现在你需要做出决定。如果要在此处插入4行,请使用
floor
since

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
这就是为什么我要加一点宽容