C语言中将unsigned char数组转换成float型误差问题求解

andy1658 2011-11-24 09:39:10
如题所示,代码如下:
#define MAKEWORD(a, b) ((unsigned )(((unsigned char)(a)) | ((unsigned )((unsigned char)(b))) << 8))
#define MAKELONG(a, b) ((long)(((unsigned )(a)) | ((unsigned int)((unsigned )(b))) << 16))

float ftTemp = 0;
unsigned usLowTemp = 0;
unsigned usHiTemp = 0;
long lTemp = 0;
usLowTemp = MAKEWORD(buff->buff[0], buff->buff[1]);
usHiTemp = MAKEWORD(buff->buff[2], buff->buff[3]);
lTemp = MAKELONG(usLowTemp, usHiTemp);
ftTemp = *((float*)<emp);

printf ("ftemp = %f\n", ftTemp);

我输入是值为17.89,但是打印出来的值却是17.889999,不知错在什么地方,忘高手帮忙解答,能提供更好的办法不胜感激啊
...全文
818 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2011-11-24
  • 打赏
  • 举报
回复
long和double有关系?
andy1658 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhao4zhong1 的回复:]

printf ("ftemp = %g\n", ftTemp);

用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)
同理,用二进制小数也不能精确表示某些10进制小数。
[/Quote]
楼上的两种方法都试了,应该不是输出的问题,应该是强制类型转换的过程中出的错,ftTemp中的实际值就是17.889999,希望高手能提供一个更好的方法,不胜感激
苏客达 2011-11-24
  • 打赏
  • 举报
回复
没看见在哪接收输入~
自信男孩 2011-11-24
  • 打赏
  • 举报
回复
这是输出17.89的精确度,默认的小数点是六位小数。这是提高了其精确度,你可以这样输出:
printf("%.2f\n", 17.89);可以看到结果是:17.89.这是那你确定了精确度。
赵4老师 2011-11-24
  • 打赏
  • 举报
回复
printf ("ftemp = %g\n", ftTemp);

用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10)
同理,用二进制小数也不能精确表示某些10进制小数。

andy1658 2011-11-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qq120848369 的回复:]

long和double有关系?
[/Quote]
没有关系,想吧字符整合到一个long型中,再强制转换成float型
andy1658 2011-11-24
  • 打赏
  • 举报
回复
一楼的方法是正解,谢谢

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧