孤不冷cing 发表于 2022-3-12 22:28:07

for 判断语句 用浮点数 出问题


如图,被注释部分

程序没按预想的进行,是这个 "for循环的判断语句" 导致的吗?

这种,涉及到浮点数的判断语句,是不是不适合做判断条件?

jhq999 发表于 2022-3-12 22:28:08

本帖最后由 jhq999 于 2022-3-14 07:15 编辑

孤不冷cing 发表于 2022-3-13 22:24
这是 带你学C带你飞 s1e24 课后作业 动动手 2.
我一开始想让打印的 '*' 比题目多一倍,所以 ' data - 0. ...

if (data)
                        {
                              printf("%d年%2d月:", i + 2014, j + 1);

                              data = data - min;
                              
                              for (; data>=0; data-=0.5f)//单位0.5减0.5,以1为单位减1
                              {
                                        printf("*");//printf("%c%c",32,1);
                              }

                              printf("\n");
                        }
最小值:20.50,最大值:59.80
2014年 8月:**********************
2014年 9月:*******************************
2014年10月:*****************************************************************************
2014年11月:***********************************************************
2014年12月:***********************************************************************
2015年 1月:*******************************************************************************
2015年 2月:*********************************************************************
2015年 3月:**************************
2015年 4月:************************************
2015年 5月:*************
2015年 6月:*
2015年 7月:***************
2015年 8月:*************************************
2015年 9月:*******************************************
2015年10月:*************************************************
2015年11月:************************************
2015年12月:*******************************************
2016年 1月:*****************************
2016年 2月:********************************
2016年 3月:*******************************************************
2016年 4月:***********************************
2016年 5月:*********************
2016年 6月:******
2016年 7月:*************
2016年 8月:****************************

这是减1的
最小值:20.50,最大值:59.80
2014年 8月:***********
2014年 9月:****************
2014年10月:***************************************
2014年11月:******************************
2014年12月:************************************
2015年 1月:****************************************
2015年 2月:***********************************
2015年 3月:*************
2015年 4月:******************
2015年 5月:*******
2015年 6月:*
2015年 7月:********
2015年 8月:*******************
2015年 9月:**********************
2015年10月:*************************
2015年11月:******************
2015年12月:**********************
2016年 1月:***************
2016年 2月:****************
2016年 3月:****************************
2016年 4月:******************
2016年 5月:***********
2016年 6月:***
2016年 7月:*******
2016年 8月:**************

jhq999 发表于 2022-3-12 22:59:09

数据这么整齐都是只有一个小数部分,输入时变成乘10的整数多好

gandixiwang 发表于 2022-3-13 10:56:11

能把代码复制到帖子上给我运行一下吗?

孤不冷cing 发表于 2022-3-13 16:54:16

jhq999 发表于 2022-3-12 22:59
数据这么整齐都是只有一个小数部分,输入时变成乘10的整数多好

意思是判断条件最好用整数是吗
为什么用浮点数会有问题阿
因为误差吗,能解释一下原理吗

孤不冷cing 发表于 2022-3-13 16:55:59

gandixiwang 发表于 2022-3-13 10:56
能把代码复制到帖子上给我运行一下吗?

#include <stdio.h>

int main()
{
      float min = 100.0, max = 0.0;
      float value = {
                {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.3, 35.5, 58.7, 49.6, 55.5},
                {59.8, 54.9, 33.1, 38.2, 26.6, 20.5, 27.8, 38.5, 41.5, 44.7, 38.1, 41.5},
                {34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, 0.0, 0.0, 0.0, 0.0}
      };
      float data = 0.0;
      int i, j, t, count;

      for (i = 0; i < 3; i++)
      {
                for (j = 0; j < 12; j++)
                {
                        if(value != 0.0 && value < min)
                              min = value;
                        else if(value > max)
                              max = value;
                }
      }

      printf("最小值:%.2f,最大值:%.2f\n", min, max);

      for (i = 0; i < 3; i++)
      {
                for (j = 0; j < 12; j++)
                {
                        data = value;
                        if (data)
                        {
                              printf("%d年%2d月:", i + 2014, j + 1);

                              data = data - min;
                              for (t = 1; data - 0.5 < 0.0; t++)
                              {
                                        ;
                              }
                              for (count = 0; count < t; count++)
                              {
                                        printf("*");
                              }

                              printf("\n");
                        }
                }
      }

      return 0;
}

jhq999 发表于 2022-3-13 19:26:27

本帖最后由 jhq999 于 2022-3-13 19:58 编辑

孤不冷cing 发表于 2022-3-13 16:54
意思是判断条件最好用整数是吗
为什么用浮点数会有问题阿
因为误差吗,能解释一下原理吗

0.000001!=0.0

由于精度有时运算后浮点很难达到绝对0
但我看你里面不存在这种问题

int main()
{
   float min = 100.0, max = 0.0;
      float value = {
                {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.3, 35.5, 58.7, 49.6, 55.5},
                {59.8, 54.9, 33.1, 38.2, 26.6, 20.5, 27.8, 38.5, 41.5, 44.7, 38.1, 41.5},
                {34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, 0.0, 0.0, 0.0, 0.0}
      };
      float data = 0.0;
      int i, j, t, count;

      for (i = 0; i < 3; i++)
      {
                for (j = 0; j < 12; j++)
                {
                        if(value != 0.0 && value < min)
                              min = value;
                        else if(value > max)
                              max = value;
                }
      }

      printf("最小值:%.2f,最大值:%.2f\n", min, max);

      for (i = 0; i < 3; i++)
      {
                for (j = 0; j < 12; j++)
                {
                        data = value;
                        if (data)
                        {
                              printf("%d年%2d月:", i + 2014, j + 1);

                              data = data - min;
                              for (t = 1; data< 0.0; t++)//////////////不明白为什么减0.5
                              {
                                    
                              }
                              for (count = 0; count < t; count++)
                              {
                                        printf("*");
                              }

                              printf("\n");
                        }
                }
      }

    return 0;

}

jhq999 发表于 2022-3-13 19:46:19

不知道是否是你想要的结果
int main()
{
   int min = 1000, max = 0;
      intvalue = {
                {0, 0, 0, 0, 0, 0, 0, 313, 355, 587, 496, 555},
                {598, 549, 331, 382, 266, 205, 278, 385, 415, 447, 381, 415},
                {349, 364, 475, 379, 306, 234, 266, 343, 0, 0, 0, 0}
      };
      int data = 0;
      int i, j, t, count;

      for (i = 0; i < 3; i++)
      {
                for (j = 0; j < 12; j++)
                {
                        if(value != 0 && value < min)
                              min = value;
                        else if(value > max)
                              max = value;
                }
      }

      printf("最小值:%.2f,最大值:%.2f\n", (float)min/10, (float)max/10);

      for (i = 0; i < 3; i++)
      {
                for (j = 0; j < 12; j++)
                {
                        data =value;
                        if (data)
                        {
                              printf("%d年%2d月:", i + 2014, j + 1);

                              data = data - min;
                              for (t = 1; data < 0; t++)
                              {
                                    
                              }
                              for (count = 0; count < t; count++)
                              {
                                        printf("*");
                              }

                              printf("\n");
                        }
                }
      }

    return 0;

}
最小值:20.50,最大值:59.80
2014年 8月:*
2014年 9月:*
2014年10月:*
2014年11月:*
2014年12月:*
2015年 1月:*
2015年 2月:*
2015年 3月:*
2015年 4月:*
2015年 5月:*
2015年 6月:*
2015年 7月:*
2015年 8月:*
2015年 9月:*
2015年10月:*
2015年11月:*
2015年12月:*
2016年 1月:*
2016年 2月:*
2016年 3月:*
2016年 4月:*
2016年 5月:*
2016年 6月:*
2016年 7月:*
2016年 8月:*

孤不冷cing 发表于 2022-3-13 22:24:16

jhq999 发表于 2022-3-13 19:46
不知道是否是你想要的结果

这是 带你学C带你飞 s1e24 课后作业 动动手 2.
我一开始想让打印的 '*' 比题目多一倍,所以 ' data - 0.5 '


孤不冷cing 发表于 2022-3-14 19:16:04

jhq999 发表于 2022-3-14 07:05
这是减1的

我发现我为什么有问题了,我这里不是浮点数精度导致判断条件判断错误,是我判断条件写错了,并且还少写了 data 的 计数器更新。
还是感谢解答
页: [1]
查看完整版本: for 判断语句 用浮点数 出问题