我做了这个方法

+ (CGFloat) round: (CGFloat)f {
    int a = f;
    CGFloat b = a;
    return b;
}

它按预期工作,但仅向下舍入。如果它是负数,它仍然向下舍入。

这只是我制作的一个快速方法,正确舍入并不是很重要,我只是为我的游戏舍入了相机的 x 和 y 值。

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

有帮助吗?

解决方案

已经有标准函数和您可能需要的行为 <math.h> 例如: floorf, ceilf, roundf, rintfnearbyintf (lasf 'f' 表示“浮动”版本,没有它的版本是“双”版本)。

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

2013 更新 (jessedc)

iOS 不再只有 32 位。这个问题还有许多其他答案现在更相关。

大多数答案都提到导入 tgmath.h

其他提示

2018年答案

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

let x: CGFloat = 3.5
let y = x.rounded() // 4.0

如果您想就地舍入该值,可以使用 round:

var x: CGFloat = 3.5
x.round() // 4.0

舍入规则

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

远离零

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

向下

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

接近或远离零

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

到最近的或什至

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   ***

走向零

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

向上

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

笔记

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

一个CGFloat就是typedef定义到任何一个doublefloat,所以可以四舍五入他们喜欢的任何其它实数型:

CGFloat round(CGFloat aFloat)
{
    return (int)(aFloat + 0.5);
}

请注意,虽然这个作品用浮漂小到足以携带的一小部分,它可以在较大的值行事怪异。

尝试#import "tgmath.h"

<tgmath.h>头将包括标头和<math.h><complex.h>将定义几个类型泛型宏。

正在重新发明轮子 - 这是一个C问题,不是目的C.只需使用标准C round()函数

对于32和64个工作位,你可以创建自己的宏的像

#ifndef CGFLOAT_CEIL
    #ifdef CGFLOAT_IS_DOUBLE
        #define CGFLOAT_CEIL(value) ceil(value)
    #else
        #define CGFLOAT_CEIL(value) ceilf(value)
    #endif
#endif

诗,这不是问题的答案,但另外一个有关的问题如何与32/64位值的工作。

在像MyMacros.h文件定义该和比MyApp的-Prefix.pch

添加的导入

还记得选择CGFloat的前缀为你的函数可以是一个风险,因为苹果可能会增加一个宏这样他们自我所以这就是为什么的#ifndef CGFLOAT_CEIL为

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top