鱼C论坛

 找回密码
 立即注册
查看: 1062|回复: 3

[已解决]s1e14 for语句课后题 动动手第二题

[复制链接]
发表于 2020-5-19 23:48:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

001.png

我的代码如下
  1. #include <stdio.h>
  2. #include <math.h>
  3. int main(){
  4.         float num=0;
  5.         int ch,count=1;
  6.         float k=1;
  7.         printf("请输入合法的数字:");
  8.         for (;;)
  9.         {
  10.                 ch=getchar();
  11.                 if (ch=='\n'){
  12.                         printf("请输入合法的数字:");
  13.                         k=1;
  14.                 }               
  15.                 else {
  16.                         if (ch=='q') break;
  17.                         else {
  18.                                 if (ch=='.') {k=0.1;printf("%f\n",k);
  19.                                 }
  20.                                 if (ch>='a'&&ch<='z') {
  21.                                 k=1;count=1;printf("2\n");}
  22.                                 if (ch>='0'&& ch <='9')
  23.                                 {
  24.                                 if (k==0.1)        {
  25.                                         num =  num + (ch - '0')*pow(k,count);
  26.                                         count++;
  27.                                         printf("1\n");
  28.                                 }
  29.                                 else{
  30.                                         num =  num + (ch - '0');
  31.                                         printf("2  %f\n",k);
  32.                                 }
  33.                                 }
  34.                         }
  35.                 }       
  36.         }
  37.         printf("结果是:%f\n",num);
  38.         return 0;
  39. }
复制代码
最佳答案
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倒是会降低精度呢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-19 23:56:01 | 显示全部楼层
另外我代码里面
  1. if (ch>='a'&&ch<='z')
复制代码

原来是写成
  1. if (!(ch=='.'&&ch>='0'&&ch<='9'))
  2.                                  {
  3.                                 k=1;count=1;printf("2\n");}
复制代码

然后发现只要输入完‘.’之后输入其他字符,k的值就会变回1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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倒是会降低精度呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-20 14:49:26 From FishC Mobile | 显示全部楼层
sunrise085 发表于 2020-5-20 00:29
浮点数不能用"=="比较是否相等。
因为计算机存储的精度问题,导致一个数存入计算机之后再读出来就和原值不 ...

感谢大佬解惑
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-5 08:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表