摇滚一族 发表于 2024-3-14 11:14:55

请教一个小数处理偶发不对的问题



买了一个OLED屏,里面有一个小数显示函数,我调用后,发现经常显示的数比实际小0.01
用USB串口跟踪,0.01到0.09显示和实际一样,但0.10、0.11、0.12显示就要小0.01,0.13又显示正常为0.13,百思不得其解是什么原因?
各位大神有知道是什么原因导致的吗?
IC是8H8K64U
显示函数如下:

//显示2个数字
//x,y :起点坐标
//num1:要显示的小数
//len :数字的位数
void OLED_ShowNum(u8 x,u8 y,float num1,u8 len)
{
        u8 i;
        u32 t,num;
        x=x+len*8+8;//要显示的小数最低位的横坐标
        num=num1*100;//将小数左移两位并转化为整数
        OLED_Display_GB2312_string(x-24,y,".");//显示小数点
        for(i=0;i<len;i++)
        {
                t=num%10;//取个位数的数值
                num=num/10;//将整数右移一位
                x-=8;
                if(i==2){x-=8;}//当显示出来两个小数之后,空出小数点的位置
                switch(t)
                {
                        case 0 :OLED_Display_GB2312_string(x,y,"0");break;
                        case 1 :OLED_Display_GB2312_string(x,y,"1");break;
                        case 2 :OLED_Display_GB2312_string(x,y,"2");break;
                        case 3 :OLED_Display_GB2312_string(x,y,"3");break;
                        case 4 :OLED_Display_GB2312_string(x,y,"4");break;
                        case 5 :OLED_Display_GB2312_string(x,y,"5");break;
                        case 6 :OLED_Display_GB2312_string(x,y,"6");break;
                        case 7 :OLED_Display_GB2312_string(x,y,"7");break;
                        case 8 :OLED_Display_GB2312_string(x,y,"8");break;
                        case 9 :OLED_Display_GB2312_string(x,y,"9");break;
                }
        }
}


显示脚本:

                t+=0.01;
                r+=1;                               
                printf("输出t和r:%f-%d",t,r);
                OLED_ShowNum(0,0,t,5);//显示小数
                OLED_ShowInt(0,2,r,5);//显示整数
                OLED_ShowNum(0,4,t,3);//显示小数
                OLED_ShowInt(0,6,r,3);//显示整数




跟踪照片如下:



摇滚一族 发表于 2024-3-14 11:34:53

可能我找到问题了
估计输出0.100000,实际在单片机里是0.999999,输出就有问题,尾数加了0.005后显示正常了
页: [1]
查看完整版本: 请教一个小数处理偶发不对的问题