我做了这个方法
+ (CGFloat) round: (CGFloat)f {
int a = f;
CGFloat b = a;
return b;
}
它按预期工作,但只是向下舍入。如果它是负数,它仍会向下舍入。
这只是我制作的一个快速方法,它是否正确舍入并不是很重要,我只是为了我的游戏舍入相机的 x 和 y 值。
这个方法可以吗?快吗?或者有更好的解决方案吗?
最佳答案
2018年答案
这里的其他答案要么过时了,要么没有给出很好的例子。使用 Swift 内置的 rounded
函数可以很容易地对 CGFloat
进行舍入。
let x: CGFloat = 3.5
let y = x.rounded() // 4.0
如果你想就地舍入值,你可以使用round
:
var x: CGFloat = 3.5
x.round() // 4.0
舍入规则
如果您想更精确地控制数字的舍入方式,您可以使用 FloatingPointRoundingRule
.
Away from zero
x.rounded(.awayFromZero)
大于零的数字向上舍入,小于零的数字向下舍入。
3.000 -> 3.0
3.001 -> 4.0
3.499 -> 4.0
3.500 -> 4.0
3.999 -> 4.0
-3.000 -> -3.0
-3.001 -> -4.0
-3.499 -> -4.0
-3.500 -> -4.0
-3.999 -> -4.0
Down
x.rounded(.down)
将具有小数值的任何数字向下舍入到下一个更小的整数。这与 floor(x)
相同。
3.000 -> 3.0
3.001 -> 3.0
3.499 -> 3.0
3.500 -> 3.0
3.999 -> 3.0
-3.000 -> -3.0
-3.001 -> -4.0
-3.499 -> -4.0
-3.500 -> -4.0
-3.999 -> -4.0
To nearest or away from zero
x.rounded(.toNearestOrAwayFromZero) // same as x.rounded()
小数四舍五入为最接近的整数值。但是,当值恰好位于中间时(如 3.5
或 -3.5
),则正数会向上舍入,负数会向下舍入。
它的名字可能很长很复杂,但这通常是人们在学校学习舍入的方式。如果您只是执行 x.rounded()
,这也是使用的规则。
3.000 -> 3.0
3.001 -> 3.0
3.499 -> 3.0
3.500 -> 4.0 ***
3.999 -> 4.0
-3.000 -> -3.0
-3.001 -> -3.0
-3.499 -> -3.0
-3.500 -> -4.0 ***
-3.999 -> -4.0
To nearest or even
x.rounded(.toNearestOrEven)
这类似于 toNearestOrAwayFromZero
,只是现在 .5
值四舍五入为偶数。
3.000 -> 3.0
3.001 -> 3.0
3.499 -> 3.0
3.500 -> 4.0 ***
3.999 -> 4.0
4.500 -> 4.0 ***
-3.000 -> -3.0
-3.001 -> -3.0
-3.499 -> -3.0
-3.500 -> -4.0 ***
-3.999 -> -4.0
-4.500 -> -4.0 ***
Toward zero
x.rounded(.towardZero)
这只是具有截断任何小数值的效果。如果您需要 Int
,您可以使用 Int(x)
做同样的事情。
3.000 -> 3.0
3.001 -> 3.0
3.499 -> 3.0
3.500 -> 3.0
3.999 -> 3.0
-3.000 -> -3.0
-3.001 -> -3.0
-3.499 -> -3.0
-3.500 -> -3.0
-3.999 -> -3.0
Up
x.rounded(.up)
这与 .down
相反。所有小数都向上舍入。这与 ceil(x)
相同。
3.000 -> 3.0
3.001 -> 4.0
3.499 -> 4.0
3.500 -> 4.0
3.999 -> 4.0
-3.000 -> -3.0
-3.001 -> -3.0
-3.499 -> -3.0
-3.500 -> -3.0
-3.999 -> -3.0
注意事项
- 不要忘记考虑负值。
round
和rounded
的结果仍然是CGFloat
。如果您需要Int
,您必须像Int(myCGFloat)
一样转换它。- 不再需要使用 C 数学函数
round(x)
、ceil(x)
和floor(x)
。但是,如果您确实使用它们,它们可以同时处理 64 位和 32 位架构,因此您可能已经通过roundf
、ceilf
和floorf
看到任何答案现在已经过时了。
关于ios - 如何舍入 CGFloat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2667130/