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);