23

我经常需要将 a 设置为 a 或 ceilCGFloatint计算数组索引。

我永久看到的问题floorf(theCGFloat)orceilf(theCGFloat)可能存在浮点不准确的问题。

那么如果 my CGFloatis2.0f但在内部它被表示为1.999999999999f或类似的东西怎么办。我做得到floorf1.0f这又是一个浮动。然而,我必须将这个野兽转换为 int,这可能会引入另一个问题。

是否有最佳实践如何将 a 放置或放置到float某个位置,以int使类似的东西2.0永远不会意外地落地,1而类似的东西2.0永远不会意外地放置在天花板上2

4

3 回答 3

33

快速补充答案

我将此添加为那些来这里寻找如何使用floorceil使用CGFloat(就像我一样)的人的补充答案。

var myCGFloat: CGFloat = 3.001
floor(myCGFloat) // 3.0
ceil(myCGFloat) // 4.0

如果Int需要 an,则可以将其强制转换为一个。

var myCGFloat: CGFloat = 3.001
Int(floor(myCGFloat)) // 3
Int(ceil(myCGFloat)) // 4

更新

不再需要使用 Cfloorceil函数。您可以将 Swiftround()舍入规则一起使用。

var myCGFloat: CGFloat = 3.001
myCGFloat.round(.down) // 3.0
myCGFloat.round(.up) // 4.0

如果您不想修改原始变量,请使用rounded().

笔记

  • 适用于 32 位和 64 位架构。

也可以看看

于 2015-12-15T09:41:35.640 回答
22

你的问题有几个误解。

如果我的 CGFloat 是 2.0f 但在内部它表示为 1.999999999999f 怎么办

不可能发生;2.0 和所有相当小的整数一样,具有浮点的精确表示。如果你CGFloat2.0f,那么它真的是 2.0。

像 2.0 这样的东西永远不会意外地被限制到 2

2.0的上限2;还可能是什么?


我认为您真正要问的问题是“假设我进行的计算会产生不精确的结果,在数学上应该恰好是 2.0,但实际上要少一些;当我应用floor该值时,我得到 1.0 而不是 2.0- ——我该如何预防?”

这实际上是一个相当微妙的问题,没有一个“正确”的答案。你是如何计算输入值的?你打算怎么处理结果?

于 2012-08-16T19:33:36.247 回答
4

编辑 - 阅读评论,了解为什么这个答案不正确:)

将 afloat转换为 anint是隐含的floorfie (int)5.9is 5。如果你不介意那就投吧:)

如果你想四舍五入,那么只需ceilf在四舍五入之后转换 - 转换的结果根本不会引入任何错误(或者,如果你愿意,在转换之前添加一个,即 `(int)(5.9+1)' is '6 ' - 与四舍五入相同)。

要四舍五入,只需添加 0.5 - (int)(5.9+0.5)is 6but (int)(5.4+0.5)is 5。虽然我只会使用roundf(5.9):)

于 2012-08-16T19:27:23.753 回答