用printf显示浮点数的一个问题

orion11 2009-08-26 06:22:23
#include "stdio.h"
void main(){
float c[8]={5.1,5.2,5.4,7.1,7.7,8.9,7.9,4.3};
int p=0;
float z=0;
for (p=0;p<8;p++)
{
z=z+c[p];
}
printf("总分:%lf\n",z);
}

通过调试内存中z的值为:51.60000
但是printf("总分:%lf\n",z);在屏幕上显示结果为:51.600002
请问专家这是为什么?
如何才能在内存中显示正确的z在内存中的值51.60000?

...全文
288 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lbjfeng 的回复:]
超出精度范围了·~
小兄弟·~·
所以,后面的那个2就是无效数字了·~
[/Quote]

嗯,好像float只有7位有效数字还是几位?忘了自己看
Tim·Z 2009-08-28
  • 打赏
  • 举报
回复
默认的就是输出六位小数啊,超过的就是无效数位,没达到的也会通过增加达到六位
不过你可以修改小数点的位数。例如printf("总分:%.5f\n",z);
这样输出的小数点位数就是五位了啊。
wxdcxp 2009-08-27
  • 打赏
  • 举报
回复
float的精度只能保存六位有效位,你把float改成double就可以计算出正确的值了
调试查看当然可以看到正确的值
而输出格式,中它的精度就那么高,你却硬要它输出比他精度高的数字,编译器只好给你个随便的值了
例如如果写成printf("总分:%.9f\n",z); 小数点后保留9个有效数字,它后面的四位只能是随机的值了
orion11 2009-08-27
  • 打赏
  • 举报
回复
怎么没人回答了
orion11 2009-08-26
  • 打赏
  • 举报
回复
那为什么在调试查看变量值51.60000
不存在超出精度范围了一说呀
feilong_1216 2009-08-26
  • 打赏
  • 举报
回复
这个问题的确存在。这是float精度造成的,与底层的存储有一定的关系。
lbjfeng 2009-08-26
  • 打赏
  • 举报
回复
超出精度范围了·~
小兄弟·~·
所以,后面的那个2就是无效数字了·~
zjw6861982 2009-08-26
  • 打赏
  • 举报
回复
printf("总分:%.5f\n",z);
}
wanjingwei 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 liao05050075 的回复:]
喔。不,5位小数,应该是printf("总分:%.5f\n",z);
[/Quote]
这个可以
老A四十二号 2009-08-26
  • 打赏
  • 举报
回复
用printf("总分:%f\n",z); 试试
mstlq 2009-08-26
  • 打赏
  • 举报
回复
如何才能在内存中显示正确的z在内存中的值51.60000

楼主想改变ide的debug窗口中的数值的精度?
不懂……
eijikayn 2009-08-26
  • 打赏
  • 举报
回复
printf("总分:%3.5f\n",z)
f格式:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:
%f:不指定宽度,整数部分全部输出并输出6位小数。
%m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。
%-m.nf:输出共占n列,其中有n位小数,如数值宽度小于m右端补空格。
liao05050075 2009-08-26
  • 打赏
  • 举报
回复
喔。不,5位小数,应该是printf("总分:%.5f\n",z);
liao05050075 2009-08-26
  • 打赏
  • 举报
回复
printf("总分:%.4f\n",z);

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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