最近调程序用到了LCD屏,起初在论坛里找到了坛友分享的显示小数的程序,自己挪过去发现不好用,就在坛友的程序的基础上做了一些小的修改,能满足需求了,但是近几天发现该玩的程序有个BUG,比如说传入显示数据为7.200000,屏幕上显示却变成了7.199999,刚开始怀疑是程序的事,就自己想了一个逐位分离小数部分的函数,后来发现还是时有时坏到最后才发现是自己的形参和局部变量的数据类型不对。现在附上以上提到的两个程序1.这是我根据坛友的帖子改的(在此感谢这位坛友提供的思路,在论坛上搜索“显示小数”第一个就是坛友的帖子)
//小数显示函数
//Int:整数位数 Float:小数位数
void LCD_ShowFloat(u16 x,u16 y,u8 size,float num,u8 Int,u8 Float)
{
int i,a=1,n,t;
n=num;
printf("n: %d\r\n",n);
printf("num %lf\r\n",num);
for(i=0;i<Float;i++)
{
a*=10;
t=(num-n)*a;
LCD_ShowxNum(x+8+Int*8,y,t,Float,size,0);
}
LCD_ShowxNum(x,y,n,Int,size,0);
LCD_ShowString(x+Int*8,y,200,16,size,".");
}
2.自己想的分离各位的方法(如有雷同,不胜荣幸)
//小数显示函数
//Int:整数位数 Float:小数位数
void LCD_ShowFloat(u16 x,u16 y,u8 size,double num,u8 Int,u8 Float) //注意传入参数为double
{
int i,n=0;
int mid=0;
double b=0,t=0;
n=num; //取出整数位
mid=(num-n)*10; //分离出第一位小数
t=(num-n)*10; //将小数部分传递给中间变量
printf("测试 t %lf\r\n",t); //测试用
printf("mid %d\r\n",mid);
LCD_ShowxNum(x+16,y,mid,Float,size,1); //显示第一位小数
for(i=1;i<Float;i++) //显示i+1位小数
{
b=t-mid; //求出当前小数之间的差值
mid=b*10; //扩大十倍取整,分离出第i+1位小数
t=b*10; //扩大十倍,准备下一次分离
printf("mid %d\r\n",mid); //测试用
LCD_ShowxNum(x+16+i*8,y,mid,Float,size,1); //显示i+1位小数
}
LCD_ShowxNum(x,y,n,Int,size,0);
LCD_ShowString(x+Int*8,y,200,16,size,".");
}
|