C语言中有多种数据类型,其中用的最多的就是整型、字符型和浮点型。
学习各种数据类型时,需要注意的就是如何读入这些数据和输出这些数据。
下面的例子显示了浮点数的输入和输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> int main(int argc, char *argv[]) { int a, b; double c, d; scanf("%d%d", &a, &b); scanf("%lf%lf", &c, &d); printf("%d\n", (a+b)/2); printf("%.3f\n", (c+d)/2.0); return 0; } |
变量是整数类型的需要注意除法。 在C语言中,两个整数相除,结果一定是整数,结或者果是却掉小数部分,并不是四舍五入。 例如,8/5 结果是1,不是1.6或者2。 整数还有一个非常重要的特点,就是可以进行取余运算。 8/5 = 1,余数是 3。所以,在C语言中,8/5 = 1, 8 % 5 = 3,其中 % 是取余运算。
在上面的例子中, a 和 b 是整型变量,所以 a % b 是有意义的(b不等于0),a / b 的结果一定是整数。
上面的例子中, c 和 d 是实数,或者成为浮点数。 浮点数有两种表示,分布是 float 和 double。double类型的浮点数称为双精度浮点数,float 类型的浮点数称为单精度浮点数,从名字上也很好理解,double类型的精确程度更高。C语言中的数学库函数都采用的是double类型进行运算,为的就是获得更高的精度。
建议:在你设计的程序中,遇到实数(浮点数)运算,如果没有特别说明,请采用 double 类型。
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> int main(int argc, char *argv[]) { float e, f; scanf("%f%f", &e, &f); printf("%.3f\n", (e+f)/2.0); return 0; } |
提示: float和double的输入(scanf)存在区别,输出(printf)没有区别,都是用 %f 的形式。
整数和浮点数也可以进行转换,下面的程序运行会出现奇怪的结果
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> int main(int argc, char *argv[]) { int a, b; scanf("%d%d", &a, &b); printf("%.3lf\n", (a+b)/2); return 0; } |
上面的程序存在问题,是因为 %.3lf 表示的是浮点类型,而 (a+b)/2 确是整型,所以输出是 0.000。
正确的代码应该如下所示:
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> int main(int argc, char *argv[]) { int a, b; scanf("%d%d", &a, &b); printf("%.3lf\n", (a+b)/2.0); return 0; } |
表达式 (a+b)/2.0 中2.0是浮点数,只要表达式的结果自动转换成了浮点数,就能够输出正确的结果了。
下面的例子展示了浮点数转换成整型数。
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> #include <math.h> int main(int argc, char *argv[]) { int n; double f; scanf("%lf", &f); n = sqrt(f); printf("%d\n", n); return 0; } |
sqrt(f) 表示求 f 的平方根,返回的是一个浮点数,但由于 n 是整数,所以平方根自动被转换成了整型数(舍去整数后面的小数点部分)。