OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4876|回复: 4

浮点数转换成字符串,遇到一个很奇怪的问题。C语言大神请进

[复制链接]

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2013-7-26
在线时间
0 小时
发表于 2014-8-9 01:51:08 | 显示全部楼层 |阅读模式
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然后再转换.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2256
金钱
2256
注册时间
2010-12-16
在线时间
206 小时
发表于 2014-8-9 01:51:09 | 显示全部楼层
二进制浮点的表达精度问题,如果想转换的好看,就加上精度值/10.比如输出1.2,精度0.001,就将1.2加上0.001*0.1然后再转换.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复

使用道具 举报

1

主题

16

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2013-3-24
在线时间
0 小时
发表于 2014-8-9 09:02:18 | 显示全部楼层
我用触摸屏做虚拟键盘的时候也遇到了,没有想通。然后就用两个int分别存小数和整数,小数首位默认1,再用小数点把1覆盖掉,看上去一个样。。。。
超级黑科技
回复

使用道具 举报

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2013-7-26
在线时间
0 小时
 楼主| 发表于 2014-8-9 12:31:02 | 显示全部楼层
回复【2楼】原味土豆泥:
---------------------------------
感觉碰到这种错误很郁闷
回复

使用道具 举报

10

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2013-7-26
在线时间
0 小时
 楼主| 发表于 2014-8-9 13:04:09 | 显示全部楼层
回复【4楼】shihantu:
---------------------------------
果然这样就对了,佩服!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-4 02:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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