Ios 如何安全地将CGFloat落地或落地到int?
我经常需要将Ios 如何安全地将CGFloat落地或落地到int?,ios,math,floating-point,floating-accuracy,floating-point-precision,Ios,Math,Floating Point,Floating Accuracy,Floating Point Precision,我经常需要将CGFloat设置为int,以计算数组索引 我一直看到的floorf(theCGFloat)或ceilf(theCGFloat)的问题是,浮点精度可能会出现问题 那么,如果我的CGFloat是2.0f,但在内部它表示为1.9999999999f或类似的东西,该怎么办呢。我做了floorf,得到了1.0f,这又是一个浮点数。然而,我必须将这个野兽转换为int,这可能会带来另一个问题 有没有一种最佳做法,可以将浮点设置为整数,这样2.0之类的东西就不会意外地设置为1,而2.0之类的东西就
CGFloat
设置为int
,以计算数组索引
我一直看到的floorf(theCGFloat)
或ceilf(theCGFloat)
的问题是,浮点精度可能会出现问题
那么,如果我的CGFloat
是2.0f
,但在内部它表示为1.9999999999f
或类似的东西,该怎么办呢。我做了floorf
,得到了1.0f
,这又是一个浮点数。然而,我必须将这个野兽转换为int,这可能会带来另一个问题
有没有一种最佳做法,可以将
浮点
设置为整数
,这样2.0
之类的东西就不会意外地设置为1
,而2.0
之类的东西就不会意外地设置为2
?编辑-阅读注释,了解为什么这个答案不正确右:)
将float
转换为int
是一种隐式floorf
,即(int)5.9
是5
。如果你不介意的话,就投:)
如果您想取整,则只需对ceilf的结果进行强制转换
-取整后的强制转换不应引入任何错误(或者,如果您愿意,在强制转换前添加一个错误,即,`(int)(5.9+1)`与取整相同)
要四舍五入,只需添加0.5-
(int)(5.9+0.5)
是6
,但(int)(5.4+0.5)
是5
。虽然我只想使用roundf(5.9)
:)但是在你的问题中有一些误解
如果我的CGFloat为2.0f,但在内部表示为1.99999999F,该怎么办
不可能发生;2.0与所有合理的小整数一样,具有浮点的精确表示形式。如果您的CGFloat
是2.0f
,那么它实际上是2.0
像2.0这样的东西永远不会意外地被设为2
2.0的上限为2;还可能是什么
我想你真正要问的问题是“假设我做的计算产生了一个不精确的结果,从数学上来说应该正好是2.0,但实际上稍微小一些;当我对该值应用
floor
时,我得到的是1.0而不是2.0——我如何防止这种情况发生?”
这实际上是一个相当微妙的问题,没有一个“正确”的答案。您是如何计算输入值的?你打算对结果做什么?快速补充答案 我添加此项作为补充回答,以帮助那些来到这里了解如何将
floor
和ceil
与CGFloat
一起使用的人(就像我所做的那样)
如果需要Int
,则可以将其转换为1
var myCGFloat: CGFloat = 3.001
Int(floor(myCGFloat)) // 3
Int(ceil(myCGFloat)) // 4
更新
不再需要使用Cfloor
和ceil
功能。您可以将Swiftround()
与一起使用
如果不希望修改原始变量,请使用rounded()
注释
- 适用于32位和64位体系结构
var myCGFloat: CGFloat = 3.001
Int(floor(myCGFloat)) // 3
Int(ceil(myCGFloat)) // 4
var myCGFloat: CGFloat = 3.001
myCGFloat.round(.down) // 3.0
myCGFloat.round(.up) // 4.0