鱼C论坛

 找回密码
 立即注册
查看: 1642|回复: 9

[已解决]for 判断语句 用浮点数 出问题

[复制链接]
发表于 2022-3-12 22:28:07 | 显示全部楼层 |阅读模式
10鱼币
2022-03-12 22-19-28 的屏幕截图.png
如图,被注释部分

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

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

最佳答案
2022-3-12 22:28:08
本帖最后由 jhq999 于 2022-3-14 07:15 编辑
孤不冷cing 发表于 2022-3-13 22:24
这是 带你学C带你飞 s1e24 课后作业 动动手 2.
我一开始想让打印的 '*' 比题目多一倍,所以 ' data - 0. ...

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

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

  10.                                 printf("\n");
  11.                         }
复制代码
  1. 最小值:20.50,最大值:59.80
  2. 2014年 8月:**********************
  3. 2014年 9月:*******************************
  4. 2014年10月:*****************************************************************************
  5. 2014年11月:***********************************************************
  6. 2014年12月:***********************************************************************
  7. 2015年 1月:*******************************************************************************
  8. 2015年 2月:*********************************************************************
  9. 2015年 3月:**************************
  10. 2015年 4月:************************************
  11. 2015年 5月:*************
  12. 2015年 6月:*
  13. 2015年 7月:***************
  14. 2015年 8月:*************************************
  15. 2015年 9月:*******************************************
  16. 2015年10月:*************************************************
  17. 2015年11月:************************************
  18. 2015年12月:*******************************************
  19. 2016年 1月:*****************************
  20. 2016年 2月:********************************
  21. 2016年 3月:*******************************************************
  22. 2016年 4月:***********************************
  23. 2016年 5月:*********************
  24. 2016年 6月:******
  25. 2016年 7月:*************
  26. 2016年 8月:****************************
复制代码

这是减1的
  1. 最小值:20.50,最大值:59.80
  2. 2014年 8月:***********
  3. 2014年 9月:****************
  4. 2014年10月:***************************************
  5. 2014年11月:******************************
  6. 2014年12月:************************************
  7. 2015年 1月:****************************************
  8. 2015年 2月:***********************************
  9. 2015年 3月:*************
  10. 2015年 4月:******************
  11. 2015年 5月:*******
  12. 2015年 6月:*
  13. 2015年 7月:********
  14. 2015年 8月:*******************
  15. 2015年 9月:**********************
  16. 2015年10月:*************************
  17. 2015年11月:******************
  18. 2015年12月:**********************
  19. 2016年 1月:***************
  20. 2016年 2月:****************
  21. 2016年 3月:****************************
  22. 2016年 4月:******************
  23. 2016年 5月:***********
  24. 2016年 6月:***
  25. 2016年 7月:*******
  26. 2016年 8月:**************
复制代码

最佳答案

查看完整内容

这是减1的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-3-12 22:28:08 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2022-3-14 07:15 编辑
孤不冷cing 发表于 2022-3-13 22:24
这是 带你学C带你飞 s1e24 课后作业 动动手 2.
我一开始想让打印的 '*' 比题目多一倍,所以 ' data - 0. ...

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

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

  10.                                 printf("\n");
  11.                         }
复制代码
  1. 最小值:20.50,最大值:59.80
  2. 2014年 8月:**********************
  3. 2014年 9月:*******************************
  4. 2014年10月:*****************************************************************************
  5. 2014年11月:***********************************************************
  6. 2014年12月:***********************************************************************
  7. 2015年 1月:*******************************************************************************
  8. 2015年 2月:*********************************************************************
  9. 2015年 3月:**************************
  10. 2015年 4月:************************************
  11. 2015年 5月:*************
  12. 2015年 6月:*
  13. 2015年 7月:***************
  14. 2015年 8月:*************************************
  15. 2015年 9月:*******************************************
  16. 2015年10月:*************************************************
  17. 2015年11月:************************************
  18. 2015年12月:*******************************************
  19. 2016年 1月:*****************************
  20. 2016年 2月:********************************
  21. 2016年 3月:*******************************************************
  22. 2016年 4月:***********************************
  23. 2016年 5月:*********************
  24. 2016年 6月:******
  25. 2016年 7月:*************
  26. 2016年 8月:****************************
复制代码

这是减1的
  1. 最小值:20.50,最大值:59.80
  2. 2014年 8月:***********
  3. 2014年 9月:****************
  4. 2014年10月:***************************************
  5. 2014年11月:******************************
  6. 2014年12月:************************************
  7. 2015年 1月:****************************************
  8. 2015年 2月:***********************************
  9. 2015年 3月:*************
  10. 2015年 4月:******************
  11. 2015年 5月:*******
  12. 2015年 6月:*
  13. 2015年 7月:********
  14. 2015年 8月:*******************
  15. 2015年 9月:**********************
  16. 2015年10月:*************************
  17. 2015年11月:******************
  18. 2015年12月:**********************
  19. 2016年 1月:***************
  20. 2016年 2月:****************
  21. 2016年 3月:****************************
  22. 2016年 4月:******************
  23. 2016年 5月:***********
  24. 2016年 6月:***
  25. 2016年 7月:*******
  26. 2016年 8月:**************
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-3-12 22:59:09 | 显示全部楼层
数据这么整齐都是只有一个小数部分,输入时变成乘10的整数多好
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-3-13 10:56:11 | 显示全部楼层
能把代码复制到帖子上给我运行一下吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-13 16:54:16 | 显示全部楼层
jhq999 发表于 2022-3-12 22:59
数据这么整齐都是只有一个小数部分,输入时变成乘10的整数多好

意思是判断条件最好用整数是吗
为什么用浮点数会有问题阿
因为误差吗,能解释一下原理吗
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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[3][12] = {
                {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[i][j] != 0.0 && value[i][j] < min)
                                min = value[i][j];
                        else if(value[i][j] > max)
                                max = value[i][j];
                }
        }

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

        for (i = 0; i < 3; i++)
        {
                for (j = 0; j < 12; j++)
                {
                        data = value[i][j];
                        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;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-3-13 19:26:27 | 显示全部楼层
本帖最后由 jhq999 于 2022-3-13 19:58 编辑
孤不冷cing 发表于 2022-3-13 16:54
意思是判断条件最好用整数是吗
为什么用浮点数会有问题阿
因为误差吗,能解释一下原理吗


0.000001!=0.0

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

  1. int main()
  2. {
  3.    float min = 100.0, max = 0.0;
  4.         float value[3][12] = {
  5.                 {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 31.3, 35.5, 58.7, 49.6, 55.5},
  6.                 {59.8, 54.9, 33.1, 38.2, 26.6, 20.5, 27.8, 38.5, 41.5, 44.7, 38.1, 41.5},
  7.                 {34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, 0.0, 0.0, 0.0, 0.0}
  8.         };
  9.         float data = 0.0;
  10.         int i, j, t, count;

  11.         for (i = 0; i < 3; i++)
  12.         {
  13.                 for (j = 0; j < 12; j++)
  14.                 {
  15.                         if(value[i][j] != 0.0 && value[i][j] < min)
  16.                                 min = value[i][j];
  17.                         else if(value[i][j] > max)
  18.                                 max = value[i][j];
  19.                 }
  20.         }

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

  22.         for (i = 0; i < 3; i++)
  23.         {
  24.                 for (j = 0; j < 12; j++)
  25.                 {
  26.                         data = value[i][j];
  27.                         if (data)
  28.                         {
  29.                                 printf("%d年%2d月:", i + 2014, j + 1);

  30.                                 data = data - min;
  31.                                 for (t = 1; data  < 0.0; t++)//////////////不明白为什么减0.5
  32.                                 {
  33.                                     
  34.                                 }
  35.                                 for (count = 0; count < t; count++)
  36.                                 {
  37.                                         printf("*");
  38.                                 }

  39.                                 printf("\n");
  40.                         }
  41.                 }
  42.         }

  43.     return 0;

  44. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-3-13 19:46:19 | 显示全部楼层
不知道是否是你想要的结果
  1. int main()
  2. {
  3.    int min = 1000, max = 0;
  4.         int  value[3][12] = {
  5.                 {0, 0, 0, 0, 0, 0, 0, 313, 355, 587, 496, 555},
  6.                 {598, 549, 331, 382, 266, 205, 278, 385, 415, 447, 381, 415},
  7.                 {349, 364, 475, 379, 306, 234, 266, 343, 0, 0, 0, 0}
  8.         };
  9.         int data = 0;
  10.         int i, j, t, count;

  11.         for (i = 0; i < 3; i++)
  12.         {
  13.                 for (j = 0; j < 12; j++)
  14.                 {
  15.                         if(value[i][j] != 0 && value[i][j] < min)
  16.                                 min = value[i][j];
  17.                         else if(value[i][j] > max)
  18.                                 max = value[i][j];
  19.                 }
  20.         }

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

  22.         for (i = 0; i < 3; i++)
  23.         {
  24.                 for (j = 0; j < 12; j++)
  25.                 {
  26.                         data =value[i][j];
  27.                         if (data)
  28.                         {
  29.                                 printf("%d年%2d月:", i + 2014, j + 1);

  30.                                 data = data - min;
  31.                                 for (t = 1; data < 0; t++)
  32.                                 {
  33.                                     
  34.                                 }
  35.                                 for (count = 0; count < t; count++)
  36.                                 {
  37.                                         printf("*");
  38.                                 }

  39.                                 printf("\n");
  40.                         }
  41.                 }
  42.         }

  43.     return 0;

  44. }
复制代码
  1. 最小值:20.50,最大值:59.80
  2. 2014年 8月:*
  3. 2014年 9月:*
  4. 2014年10月:*
  5. 2014年11月:*
  6. 2014年12月:*
  7. 2015年 1月:*
  8. 2015年 2月:*
  9. 2015年 3月:*
  10. 2015年 4月:*
  11. 2015年 5月:*
  12. 2015年 6月:*
  13. 2015年 7月:*
  14. 2015年 8月:*
  15. 2015年 9月:*
  16. 2015年10月:*
  17. 2015年11月:*
  18. 2015年12月:*
  19. 2016年 1月:*
  20. 2016年 2月:*
  21. 2016年 3月:*
  22. 2016年 4月:*
  23. 2016年 5月:*
  24. 2016年 6月:*
  25. 2016年 7月:*
  26. 2016年 8月:*
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-13 22:24:16 | 显示全部楼层
jhq999 发表于 2022-3-13 19:46
不知道是否是你想要的结果

这是 带你学C带你飞 s1e24 课后作业 动动手 2.
我一开始想让打印的 '*' 比题目多一倍,所以 ' data - 0.5 '
2022-03-13 22-12-16 的屏幕截图.png
2022-03-13 22-15-19 的屏幕截图.png
2022-03-13 22-17-51 的屏幕截图.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-3-14 19:16:04 | 显示全部楼层

我发现我为什么有问题了,我这里不是浮点数精度导致判断条件判断错误,是我判断条件写错了,并且还少写了 data 的 计数器更新。
还是感谢解答
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 19:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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