运算精度丢失和数值丢失问题
标签(空格分隔): 编程竞赛 编程错题
在做题时,我经常会碰到程序很对,但结果出错的问题。如下面这个。
【题目描述】
经常出国旅行的驴友都知道,需要及时了解当地的气温状况。但不少国家采用了不同的温度计量单位:有些使用华氏温度标准(F),有些使用摄氏温度(C)。现在,请你根据温度转换公式设计一个温度转换程序,可以进行温度转换。如果输入摄氏温度,显示转换的华氏温度;如果输入华氏温度,显示转换的摄氏温度。温度转换的公式为:F=(C×9/5)+32 ,式中F表示华氏温度,C表示摄氏温度。
【输入】
仅一行,2个数。第一个为整数(1或2)表示转换的类型,1表示华氏温度转换为摄氏温度,2表示摄氏温度转华氏温度;第2个为浮点数表示需要转换的温度值。
【输出】
转换后的温度值(保留小数点后 2 位)。输出格式为“The Centigrade is 37.78”或“The Fahrenheit is 37.78”。
这道题很简单,但是我刚开始写的代码是这样的。
#include <stdio.h>
int main()
{
int i;
float t,t1,t2;
scanf("%d %f",&i,&t);
t1 = 5/9*(t-32);
t2 = 9/5*t+32;
switch (i)
{
case 1: printf("The Centigrade is %.2f\n",t1);break;
case 2: printf("The Fahrenheit is %.2f\n",t2);break;
default: printf("error\n");
}
return 0;
}
注意第七和第八行。程序很对,但每次执行1选择时,结果都是0;每次执行选择2时,结果都是一个整型数。很无语,我始终找不出来是为什么。
后来我才发现,问题出在整型数上了。以第七行为例,C语言二元运算符自左向右运算,是一步步得出结果的,而不是像人一样一下子出结果。当它读到“5/9”时,计算出来的数不是1.8,而是0,因为两个整型数运算,结果还是整型数。这就是问题所在,第八行同理。
如何解决呢?用自动类型转换,可以解决整型变浮点型位数丢失的问题,只需要在其中一个整型数前乘以1.0即可。