How to safely floor or ceil a CGFloat to int?
为了计算数组索引,我经常需要将
我对
那么,如果我的
有没有一个最佳的做法,如何地板或天花板一个
快速补充答案
我补充说,这是对那些来这里研究如何使用
1 2 3 | var myCGFloat: CGFloat = 3.001 floor(myCGFloat) // 3.0 ceil(myCGFloat) // 4.0 |
如果需要一个
1 2 3 | var myCGFloat: CGFloat = 3.001 Int(floor(myCGFloat)) // 3 Int(ceil(myCGFloat)) // 4 |
号
更新
不再需要使用c
1 2 3 | var myCGFloat: CGFloat = 3.001 myCGFloat.round(.down) // 3.0 myCGFloat.round(.up) // 4.0 |
如果不希望修改原始变量,则使用
笔记
- 适用于32位和64位体系结构。
另请参见
- 如何舍入CGfloat
你的问题中有几个误解。
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,但实际上要小一些;当我把
floor 应用于该值时,我得到的是1.0而不是2.0——我如何防止这种情况发生?"这实际上是一个相当微妙的问题,没有一个"正确"的答案。您是如何计算输入值的?你打算怎么处理结果?
编辑-阅读评论以了解此答案不正确的原因:)
将
float 投射到int 上是一种隐式floorf ,即(int)5.9 是5 。如果你不介意的话,那就投吧:)如果你想进行四舍五入,那么只需在四舍五入后进行
ceilf 转换的结果不应引入任何错误(或者,如果你想,在转换前添加一个错误,即:"(int)(5.9+1)"是"6"-与四舍五入相同)。四舍五入,加0.5-
(int)(5.9+0.5) 为6 ,(int)(5.4+0.5) 为5 。虽然我只会使用roundf(5.9) :)