Objective-C和Sprite Kit游戏开发从入门到精通
上QQ阅读APP看书,第一时间看更新

2.6 浮点数

除了整数,代码中使用的另一种基本数据类型就是浮点型,它用于处理包含小数部分的数据。在Objective-C中,常用的浮点数类型包括float和double,其中:

❑ float称为单精度浮点数,在NSLog()函数中的格式化字符为“%f ”,我们还可以使用特殊的格式显示浮点数,比如使用“%e”会以科学计数法显示浮点数。

❑ double称为双精度浮点数,其处理数据范围更大,在NSLog()函数中的格式化字符为“%Lf ”。

此外,在Foundation框架(Core Graphics)中,定义了浮点数类型的别名,如CGFloat类型在64位平台下定义为double类型的别名,而在32位环境下定义为float类型的别名。

开发过程中,可能经常需要在整数和浮点数类型之间进行转换,接下来,我们就以int和double类型为例讨论整数与浮点数之间的转换问题。

首先,从整数类型到浮点数类型的转换是没有问题的,直接赋值就可以了,如下面的代码。

    int iNum = 100;
    double fNum = iNum;

代码中,整数实际上是隐式转换为浮点数,因为double类型比int类型的取值范围大,所以,这种隐式的转换是没有问题的。

反过来,当我们需要将double类型转换为int类型时就要注意:小数部分会丢失,这一点并不难理解,因为整数不能保存小数部分。如果下定决定这么做,可以使用强制转换明确进行转换的决心,如下面的代码。

    double fNum = 100.56;
    int iNum = (int)fNum;

代码中,我们在需要转换的数据前使用了一对圆括号,其中的数据类型就是转换操作的目标类型,这种数据类型转换方式就称为强制转换。

浮点数进行算术运算时,可以使用加法、减法、乘法和除法运算符,而且,两个浮点数运算的结果依然是浮点数。在这些运算中,如果混合有浮点数和整数,会自动将整数转换为浮点数以后计算,计算结果同样为浮点数。对于取余运算,则会将浮点数自动转换为整数后计算,也就是说,在Objective-C中,浮点数不能进行取余运算。

下面的代码演示了浮点数的算术运算。

    double x = 10.56 , y = 3.0;
    NSLog(@"x + y = %Lf", x + y);  // 13.56
    NSLog(@"x - y = %Lf", x - y);  // 7.56
    NSLog(@"x * y = %Lf", x * y);  // 31.68
    NSLog(@"x / y = %Lf", x / y);  // 3.52
    NSLog(@"x % y = %Lf", x % y);  // 1

接下来的一个问题,我们应该如何处理丢失的小数部分?

默认情况下,浮点数在转换成整数时,会直接舍弃小数部分。不过,我们也可以自己做一点点决定,可以参考下面几个函数处理浮点数。

❑ floorf()函数,舍去参数中的小数部分,只返回整数部分,请注意,此函数的参数和返回结果都是float类型,如果需要整数类型,还是需要进行转换操作。如果操作double类型,则使用floor()函数。

❑ ceilf()函数,舍去参数中的小数部分,整数部分加1,此函数的参数和返回值同样为float类型;相应的操作double类型的函数是ceil()。

最后放松一下,我们算一算月球的腰围,即月球赤道的长度,如下面的代码。

    double r = 1738.0;
    double circumference = r * 2 * M_PI;
    NSLog(@"月亮半径为%Lf km,其周长为%Lf km", r,  circumference);