鱼C论坛

 找回密码
 立即注册
查看: 1470|回复: 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. ...

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月:**************

最佳答案

查看完整内容

这是减1的
想知道小甲鱼最近在做啥?请访问 -> 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. ...

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月:**************
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-12 22:59:09 | 显示全部楼层
数据这么整齐都是只有一个小数部分,输入时变成乘10的整数多好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-13 10:56:11 | 显示全部楼层
能把代码复制到帖子上给我运行一下吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

意思是判断条件最好用整数是吗
为什么用浮点数会有问题阿
因为误差吗,能解释一下原理吗
想知道小甲鱼最近在做啥?请访问 -> 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;
}
想知道小甲鱼最近在做啥?请访问 -> 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
但我看你里面不存在这种问题
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.0; t++)//////////////不明白为什么减0.5
                                {
                                    
                                }
                                for (count = 0; count < t; count++)
                                {
                                        printf("*");
                                }

                                printf("\n");
                        }
                }
        }

    return 0;

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-13 19:46:19 | 显示全部楼层
不知道是否是你想要的结果
int main()
{
   int min = 1000, max = 0;
        int  value[3][12] = {
                {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[i][j] != 0 && value[i][j] < min)
                                min = value[i][j];
                        else if(value[i][j] > max)
                                max = value[i][j];
                }
        }

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

        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; 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月:*
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

我发现我为什么有问题了,我这里不是浮点数精度导致判断条件判断错误,是我判断条件写错了,并且还少写了 data 的 计数器更新。
还是感谢解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 06:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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