运算精度丢失和数值丢失问题

运算精度丢失和数值丢失问题

标签(空格分隔): 编程竞赛 编程错题


在做题时,我经常会碰到程序很对,但结果出错的问题。如下面这个。

【题目描述】
经常出国旅行的驴友都知道,需要及时了解当地的气温状况。但不少国家采用了不同的温度计量单位:有些使用华氏温度标准(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即可。

posted @ 2017-12-12 08:43  CF过2100就买ARCTERYX  阅读(138)  评论(0编辑  收藏  举报