打印

问一个keil处理浮点数的问题

[复制链接]
5560|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
i7gly|  楼主 | 2011-12-28 09:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序是这样的
void display(float)
{
uint number;
while((num-(int)num)>0)
     {
      xiaoshu =1;//计算小数的位数
     num*=10;
     }
number=num://将number作整数送去显示
}
问题来了,浮点数只能显示到3.56
改成3.66就显示成65536了,怎么会这样的?要是换成98.7又可以,小数多了就不行了,求解答。把变量改成双精度也不行

相关帖子

沙发
ayb_ice| | 2011-12-28 10:34 | 只看该作者
可以先分离出小数与整数部分(标准C有库函数),然后对小数部分放大变成整数
比如: 3.14159=3+0.14159
0.14159*100000=14159
然后....

使用特权

评论回复
板凳
i7gly|  楼主 | 2011-12-28 14:07 | 只看该作者
嗯,谢谢楼上提点,以成功解决问题

使用特权

评论回复
地板
i7gly|  楼主 | 2011-12-28 14:08 | 只看该作者
我贴程序出来给大家看看吧,是在12864里面显示浮点数的函数,虽然很乱,不过可以解决问题还是很让人激动的





        void display_f(uchar y,uchar x,float shuzi)                           //显示float型数字
                {
                uchar s1,s2,s3,s4,s5,s6,s7,s8;
                uchar xiaoshu=0,fushu=0,i;
                unsigned long ishuzi=0;
               
                if(shuzi<0)                  //判断是否是负数
                        {
                        fushu=1;
                        shuzi=fabs(shuzi);          //如果是负数,取绝对值
                        }

                ishuzi=shuzi*1000000;                  //使有可能为小数的位都不为小数
                for(i=6;i>0;i--)
                        {
                        if((ishuzi%10)>0)
                                {
                                xiaoshu+=i;
                                i=1;
                                }
                        ishuzi/=10;
                        }

                ishuzi=shuzi*pow(10,xiaoshu);          //消除数字后面的小数

                s1=ishuzi/10000000;                  
                s2=ishuzi%10000000/1000000;
                s3=ishuzi%1000000/100000;  
                s4=ishuzi%100000/10000;          
                s5=ishuzi%10000/1000;          
                s6=ishuzi%1000/100;                  
                s7=ishuzi%100/10;                  
                s8=ishuzi%10;                          
                lcd_pos(y,x);                            //写入坐标
                if(fushu)write_dat('-');
                else write_dat(' ');                //如果是负数则显示负号,不是则显示空格号

                if(s1==0)write_dat(' ');
                else                                                //如果数字为0,则显示空格
                write_dat(tablen[s1]);

                if(s2==0&s1==0&xiaoshu<6)write_dat(' ');
                else                                                //如果数字为0,且小数小于6位,则显示空格
                write_dat(tablen[s2]);

                if(xiaoshu==6)write_dat('.');         //如果小数为6位,则在这里显示小数点
                if(s3==0&s2==0&s1==0&xiaoshu<5)write_dat(' ');
                else                                                //如果数字为0,且小数小于5位,则显示空格
                write_dat(tablen[s3]);

                if(xiaoshu==5)write_dat('.');         //如果小数为5位,则在这里显示小数点
                if(s4==0&s3==0&s2==0&s1==0&xiaoshu<4)write_dat(' ');
                else                                                //如果数字为0,且小数小于4位,则显示空格
                write_dat(tablen[s4]);

                if(xiaoshu==4)write_dat('.');         //如果小数为4位,则在这里显示小数点
                if(s5==0&s4==0&s3==0&s2==0&s1==0&xiaoshu<3)write_dat(' ');
                else                                                //如果数字为0,且小数小于3位,则显示空格
                write_dat(tablen[s5]);

                if(xiaoshu==3)write_dat('.');         //如果小数为3位,则在这里显示小数点
                if(s6==0&s5==0&s4==0&s3==0&s2==0&s1==0&xiaoshu<2)write_dat(' ');
                else                                                //如果数字为0,且小数小于2位,则显示空格
                write_dat(tablen[s6]);

                if(xiaoshu==2)write_dat('.');         //如果小数为2位,则在这里显示小数点                                               
                write_dat(tablen[s7]);
                if(xiaoshu==1)write_dat('.');         //如果小数为1位,则在这里显示小数点
                write_dat(tablen[s8]);
                }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

156

帖子

3

粉丝