我经常需要把一个CGFloat或者一个CGFloat放在一个int中,用于计算一个数组索引.
我用floorf(theCGFloat)或ceilf(theCGFloat)永久性地看到的问题是浮点不准确会造成麻烦.
那么如果我的CGFloat是2.0f,而在内部它被表示为1.999999999999f或类似的东西.我做floorf并得到1.0f,这是一个浮动.然而,我必须把这个野兽变成int,这可能引发另外一个问题.
有没有一个最佳实践,如何将一个浮动浮动到一个int,使得像2.0这样的东西永远不会意外地被置于1,像2.0这样的东西永远不会被忽略到2?
解决方法
你的问题有几个误解.
what if my CGFloat is 2.0f but internally it is represented as 1.999999999999f
不能发生; 2.0,像所有相当小的整数一样,在浮点中具有精确的表示.如果你的CGFloat是2.0f,那么它真的是2.0.
something like 2.0 would never accidentally get ceiled to 2
2.0的上限为2;还有什么可能呢?
我认为你真正问的问题是“假设我做了一个计算,产生一个不精确的结果,数学上应该是2.0,但实际上稍微少一些;当我应用于这个值时,我得到1.0而不是2.0 – 我该怎么办?
这实际上是一个相当微妙的问题,没有一个“正确的”答案.你如何计算输入值?你会对结果做些什么?