十月故里 发表于 2020-5-19 23:48:57

s1e14 for语句课后题 动动手第二题

动动手里面的第二题,因为这一节主要是讲for我就想试一下用for来做这个题,发现一个问题,当输入浮点数如2.2的时候,
我设置了一个判断,当输入‘.'的时候会设置一个k=0.1的值,
然后后面再判断当k==0.1的时候,实现浮点数的转换
但是实际测试结果是始终进不去if (k==0.1)的语句中,见下图,虽然k已经为0.1了,但是if (k==0.1)结果是为false



我的代码如下
#include <stdio.h>
#include <math.h>
int main(){
        float num=0;
        int ch,count=1;
        float k=1;
        printf("请输入合法的数字:");
        for (;;)
        {
                ch=getchar();
                if (ch=='\n'){
                        printf("请输入合法的数字:");
                        k=1;
                }               
                else {
                        if (ch=='q') break;
                        else {
                                if (ch=='.') {k=0.1;printf("%f\n",k);
                                }
                                if (ch>='a'&&ch<='z') {
                                k=1;count=1;printf("2\n");}
                                if (ch>='0'&& ch <='9')
                                {
                                if (k==0.1)        {
                                        num =num + (ch - '0')*pow(k,count);
                                        count++;
                                        printf("1\n");
                                }
                                else{
                                        num =num + (ch - '0');
                                        printf("2%f\n",k);
                                }
                                }
                        }
                }       
        }
        printf("结果是:%f\n",num);
        return 0;
}

十月故里 发表于 2020-5-19 23:56:01

另外我代码里面if (ch>='a'&&ch<='z')
原来是写成if (!(ch=='.'&&ch>='0'&&ch<='9'))
                               {
                                k=1;count=1;printf("2\n");}
然后发现只要输入完‘.’之后输入其他字符,k的值就会变回1

sunrise085 发表于 2020-5-20 00:29:15

浮点数不能用"=="比较是否相等。
因为计算机存储的精度问题,导致一个数存入计算机之后再读出来就和原值不一样的。
0.1存进去之后在读出来就不是0.1了,很接近0.1,但是有误差
浮点数比较相等一般是 (k-0.1<0.00001)这里0.00001也可以更小,看你的精度要求了。不过float有效位数只有8位,若位数写的再多,就没有相等的数了。
一般不建议判断浮点数相等

你的程序中k就是个标记,完全可以定义成int,在pow那里直接写0.1,而不必写k,写k倒是会降低精度呢

十月故里 发表于 2020-5-20 14:49:26

sunrise085 发表于 2020-5-20 00:29
浮点数不能用"=="比较是否相等。
因为计算机存储的精度问题,导致一个数存入计算机之后再读出来就和原值不 ...

感谢大佬解惑
页: [1]
查看完整版本: s1e14 for语句课后题 动动手第二题