ios - 如何舍入 CGFloat

标签 ios objective-c math cgfloat

我做了这个方法

+ (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

注意事项

  • 不要忘记考虑负值。
  • roundrounded 的结果仍然是CGFloat。如果您需要 Int,您必须像 Int(myCGFloat) 一样转换它。
  • 不再需要使用 C 数学函数 round(x)ceil(x)floor(x)。但是,如果您确实使用它们,它们可以同时处理 64 位和 32 位架构,因此您可能已经通过 roundfceilffloorf 看到任何答案现在已经过时了。

关于ios - 如何舍入 CGFloat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2667130/

相关文章:

ios - 引用项目在 viewDidLoad 中安全地初始化

objective-c - Obj-C 中的 NSNumber 常量

iPhone:导航栏返回导航项目onClick-event?

iphone - 基于图像的核心图形绘制

c# - 大量的 BigInteger 日志问题

algorithm - 是否可以使用配对函数来表示一个数组中的所有值是否都小于另一个数组中的对应值?

ios - 关闭 subview 时如何设置计时器

ios - 自定义栏按钮项目无法正确检测触摸

ios - 将base64图像上传到服务器

java - 乒乓球离开帕德尔