代码之家  ›  专栏  ›  技术社区  ›  Johannes Jensen

如何圆浮动

  •  18
  • Johannes Jensen  · 技术社区  · 14 年前

    我做了这个方法

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

    它像预期的那样工作,但它只是四舍五入。如果是负数,它还是四舍五入。

    这只是一个快速的方法,我做的,这不是很重要,它轮正确,我只是让它轮相机的x和y值为我的游戏。

    6 回复  |  直到 8 年前
        1
  •  28
  •   Community NathanOliver    7 年前

    已经有了一些标准函数,其中包含您可能需要的行为 <math.h> floorf , ceilf , roundf , rintf nearbyintf (lasf'f'表示“float”版本,没有它的版本是“double”版本)。

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

    tgmath.h

        2
  •  65
  •   Suragch Shmidt    6 年前

    这里的其他答案要么是过时的,要么不是很好的例子。围捕一只猫很容易 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 .

    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
    

    笔记

    • 结果 仍然是 CGFloat公司 . 如果你需要 Int(myCGFloat) .
    • round(x) , 天花板(x) 地板(x) 不再。但是,如果您确实使用了它们,它们将同时处理64位和32位体系结构,因此您可能已经看到了它们的任何答案 roundf ceilf floorf
        3
  •  5
  •   zneak    9 年前

    A CGFloat 类型定义为 double float

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

    请注意,虽然这适用于小到足以携带一个分数的浮点值,但它在大值上的行为可能很奇怪。

        4
  •  1
  •   Paul Lynch    14 年前

    你在重新发明轮子-这是一个C问题,而不是客观的C。只需使用标准的C round()函数。

        5
  •  1
  •   ASGM    11 年前

    尝试 #import "tgmath.h" .

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

        6
  •  0
  •   Saren Inden    10 年前

    对于32位和64位,您可以创建自己的宏

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

    还要记住,选择CGFloat作为函数的前缀可能会有风险,因为苹果可能会自行添加这样的宏,所以#ifndef CGFloatŠCEIL是