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
这里的其他答案要么已过时,要么没有给出好的例子.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)
round和rounded仍在CGFloat.如果你需要,Int你必须转换它Int(myCGFloat).round(x),ceil(x)和floor(x)了.但是,如果你使用它们,他们处理你可能已经看到有两个64个和32位架构,使任何答案roundf,ceilf而floorf现在已经过时了.Ser*_*gGr 26
目前已经与行为标准功能,你可能需要<math.h>如:floorf,ceilf,
roundf,rintf和nearbyintf(lasf"F"的意思是"浮动"的版本,版本没有它是"双重"的版本).
最好使用标准方法,不仅因为它们是标准方法,而且因为它们在边缘情况下工作得更好.
2013年更新(jessedc)
iOS不再只是32位.此问题还有许多其他答案现在更具相关性.
大多数答案提到进口 tgmath.h
A CGFloat是a double或a的typedef float,所以你可以像任何其他真实类型一样对它们进行舍入:
CGFloat round(CGFloat aFloat)
{
return (int)(aFloat + 0.5);
}
Run Code Online (Sandbox Code Playgroud)
请注意,虽然这适用于小到足以携带分数的浮点数,但它对大值可能会很奇怪.
| 归档时间: |
|
| 查看次数: |
28252 次 |
| 最近记录: |