printf(" %3d %6dn", fahr, celsius);
打印 fahr 与 celsius 的值,这样,fahr 的值占 3 个数字宽,celsius 的值占 6 个数字宽,输出的结果如下所示:
0 -17
20 -6
40 4
60 15
80 26
100 37
...
另一个较为严重的问题是,由于我们使用的是整型算术运算,因此经计算得到的摄氏温度值不太精确,例如,与 0℉对应的精确的摄氏温度应该为-17.8℃,而不是-17℃。为了得到更精确的结果,应该用浮点算术运算代替上面的整型算术运算。这就需要对程序做适当修改。下面是该程序的又一种版本
#include <stdio.h>
/* print Fahrenheit-Celsius table
for fahr = 0, 20, ..., 300; floating-point version */
main()
{
float fahr, celsius;
float lower, upper, step;
lower = 0;
upper = 300;
step = 20;
/* lower limit of temperatuire scale */
/* upper limit */
/* step size */
fahr = lower;
while (fahr <= upper) {
celsius = (5.0/9.0) * (fahr-32.0);
printf("%3.0f %6.1fn", fahr, celsius);
fahr = fahr + step;
}
}
这个程序与前一个程序基本相同,不同的是,它把 fahr 与 celsius 声明为 float 类型,转换公式的表述方式也更自然一些。在前一个程序中,之所以不能使用 5 / 9 的形式,是因为按整型除法的计算规则,它们相除并舍位后得到的结果为 0。但是,常数中的小数点表明该常数是一个浮点数,因此,5.0 / 9.0 是两个浮点数相除,结果将不被舍位。
如果某个算术运算符的所有操作数均为整型,则执行整型运算。但是,如果某个算术运算符有一个浮点型操作数和一个整型操作数,则在开始运算之前整型操作数将会被转换为浮点型。例如,在表达式 fahr – 32 中,32 在运算过程中将被自动转换为浮点数再参与运算。不过,即使浮点常量取的是整型值,在书写时最好还是为它加上一个显式的小数点,这样可以强调其浮点性质,便于阅读。
在这里需要注意,赋值语句 fahr = lower; 与条件测试语句 while (fahr <= upper) 也都是按照这种方式执行的,即在运算之前先把 int 类型的操作数转换为 float 类型的操作数。
printf 中的转换说明%3.0f 表明待打印的浮点数(即 fahr)至少占 3 个字符宽,且不带小数点和小数部分;%6.1f 表明另一个待打印的数(celsius)至少占 6 个字符宽,且小数点后面有 1 位数字。其输出如下所示:
0 -17.8
20 -6.7
40 4.4
...
格式说明可以省略宽度与精度,例如,%6f 表示待打印的浮点数至少有 6 个字符宽;%.2f指定待打印的浮点数的小数点后有两位小数,但宽度没有限制;%f 则仅仅要求按照浮点数打印该数。










