免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2538 | 回复: 3
打印 上一主题 下一主题

[C] 有些小数无法完全精确表示,那么为什么能输出0.1这样的小数。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-29 19:20 |只看该作者 |倒序浏览
0.1在计算机中是无法完全精确存储的,无论double还是什么精确位数都有限,那么问题来了。
0.1在计算机中存储转换为二进制就是(float类型):0.0001,100,1100,1100,1100,1100,1101

float x = 0.1
printf("%f",x);

这样输出的却可以完全精确为0.1.
是函数作了近似还是怎么的。?

论坛徽章:
0
2 [报告]
发表于 2014-10-29 19:54 |只看该作者
另外贴一段代码:
#include <stdio.h>

int main(int argc, char *argv[])
{
struct data
{
float a;
char b;
char c;
char d;
char e;
};
struct data tmp = {0.1,'a','b','c','\n'};
FILE *fp = fopen("test.dat", "wb");
fwrite(&tmp,sizeof(tmp),1,fp);
printf("%f\n%c\n%c\n%c\n%c\n",tmp.a,tmp.b,tmp.c,tmp.d,tmp.e);
struct data tmp2;
fclose(fp);
FILE *fp2 = fopen("test.dat", "rb");
fread(&tmp2,sizeof(tmp2),1,fp2);
printf("%f\n%c\n%c\n%c\n%c\n",tmp2.a,tmp2.b,tmp2.c,tmp2.d,tmp2.e);

}
将0.1以写入文件,文件的内容以16进制查看 CD CC CC 3D 61 62 63 0A
再将文件的内容读入struct内,同样可以打印出0.1 a b c 和换行
printf函数会做近似操作?

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
3 [报告]
发表于 2014-10-29 22:22 |只看该作者
因为被四舍五入了~~~, 最后一位不永远不会被printf输出吧。

论坛徽章:
0
4 [报告]
发表于 2014-10-31 15:15 |只看该作者
好的,多谢回复。暂时这么理解了,不懂的太多。回复 3# folklore


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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP