初级会员

- 积分
- 90
- 金钱
- 90
- 注册时间
- 2013-7-26
- 在线时间
- 0 小时
|
5金钱
void float_to_string(u8 x,u8 y,int iPoint, double data) //iPoint,要保留小数点的位数
{
u8 str[20];
int i,j,k;
long temp,tempoten;
u8 intpart[20], dotpart[20]; // 数的整数部分和小数部分
//1.确定符号位
if(data<0) {str[0]='-';data=-data;}
else str[0]='+';
//2.确定整数部分
temp=(long)data;
i=0;
tempoten=temp/10;
while(tempoten!=0)
{
intpart=temp-10*tempoten+48; //to ascii code
temp=tempoten;
tempoten=temp/10;
i++;
}
intpart=temp+48;
//3.确定小数部分,取了12位小数
data=data-(long)data;
for(j=0;j<iPoint;j++)
{
dotpart[j]=(int)(data*10)+48; //问题就出在这里面,比如本来到这里data=0.2,经过这一步后到dotpart数组里的该是'2'吧,可实际是'1'
data=data*10.0;
data=data-(long)data; //data*10.0后变成了2,data是double型,最后结果应该是0.0的浮点数吧?可是结果是1
}
for(k=1;k<=i+1;k++) str[k]=intpart[i+1-k];
str[i+2]='.';
for(k=i+3;k<i+j+3;k++) str[k]=dotpart[k-i-3];
str[i+j+3]='\0';
LCD_ShowString(x,y,str);
}
奇怪的是,有些数又没有这些问题,比如我输入1.2,取3位小数,输出为1.199;输入1.3,输出为1.300,是正确的结果,实在百思不得其解,望高手解惑!
|
最佳答案
查看完整内容[请看2#楼]
二进制浮点的表达精度问题,如果想转换的好看,就加上精度值/10.比如输出1.2,精度0.001,就将1.2加上0.001*0.1然后再转换.
|