如何围绕CGFloat

Joh*_*sen 18 math objective-c cgfloat ios

我做了这个方法

+ (CGFloat) round: (CGFloat)f {
    int a = f;
    CGFloat b = a;
    return b;
}
Run Code Online (Sandbox Code Playgroud)

它按预期工作,但它只是向下舍入.如果它是一个负数,它仍然会向下舍入.

这只是我制作的一个快速方法,它正确地舍入并不是非常重要,我只是为了使我的游戏围绕相机的x和y值.

这个方法好吗?它快吗?或者有更好的解决方案吗?

Sur*_*gch 54

2018答案

这里的其他答案要么已过时,要么没有给出好的例子.CGFloat使用Swift的内置rounded功能很容易圆.

let x: CGFloat = 3.5
let y = x.rounded() // 4.0
Run Code Online (Sandbox Code Playgroud)

如果要对值进行四舍五入,可以使用round:

var x: CGFloat = 3.5
x.round() // 4.0
Run Code Online (Sandbox Code Playgroud)

舍入规则

如果您想要更精确地控制数字的舍入方式,可以使用a FloatingPointRoundingRule.

远离零

x.rounded(.awayFromZero)
Run Code Online (Sandbox Code Playgroud)

高于零的数字向上舍入,低于零的数字向下舍入.

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
Run Code Online (Sandbox Code Playgroud)

x.rounded(.down)
Run Code Online (Sandbox Code Playgroud)

将任意数字用十进制值向下舍入到下一个较小的整数.这是一样的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
Run Code Online (Sandbox Code Playgroud)

到最近或远离零

x.rounded(.toNearestOrAwayFromZero)   // same as x.rounded()
Run Code Online (Sandbox Code Playgroud)

十进制数字四舍五入到最接近的整数值.但是,当值正好在中间(如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
Run Code Online (Sandbox Code Playgroud)

到最近或甚至

x.rounded(.toNearestOrEven)
Run Code Online (Sandbox Code Playgroud)

这类似于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   ***
Run Code Online (Sandbox Code Playgroud)

走向零

x.rounded(.towardZero)
Run Code Online (Sandbox Code Playgroud)

这只是具有切断任何十进制值的效果.如果你需要,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
Run Code Online (Sandbox Code Playgroud)

向上

x.rounded(.up)
Run Code Online (Sandbox Code Playgroud)

这与之相反.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
Run Code Online (Sandbox Code Playgroud)

笔记

  • 不要忘记考虑负值.
  • 结果roundrounded仍在CGFloat.如果你需要,Int你必须转换它Int(myCGFloat).
  • 有没有必要使用C数学函数round(x),ceil(x)floor(x)了.但是,如果你使用它们,他们处理你可能已经看到有两个64个和32位架构,使任何答案roundf,ceilffloorf现在已经过时了.


Ser*_*gGr 26

目前已经与行为标准功能,你可能需要<math.h>如:floorf,ceilf, roundf,rintfnearbyintf(lasf"F"的意思是"浮动"的版本,版本没有它是"双重"的版本).

最好使用标准方法,不仅因为它们是标准方法,而且因为它们在边缘情况下工作得更好.

2013年更新(jessedc)

iOS不再只是32位.此问题还有许多其他答案现在更具相关性.

大多数答案提到进口 tgmath.h

  • 任何人都知道允许编码32位和64位CPU的宏? (2认同)

zne*_*eak 5

A CGFloat是a double或a的typedef float,所以你可以像任何其他真实类型一样对它们进行舍入:

CGFloat round(CGFloat aFloat)
{
    return (int)(aFloat + 0.5);
}
Run Code Online (Sandbox Code Playgroud)

请注意,虽然这适用于小到足以携带分数的浮点数,但它对大值可能会很奇怪.