为什么结果不同

l369294289 2011-09-20 09:08:34
#include<stdio.h>
#include<stdlib.h>
#define PI 3.14
int main()
{
float r,h,a;
scanf("%f%f",&r,&h);
a=PI*r*r*h;
printf("%.2f\n",a);
printf("%.2f",PI*r*r*h);
system("pause");
return 0;
}
输入1.5 3 输出结果不同,如果不控制格式直接printf("%.2f\n",a); printf("%.2f",PI*r*r*h);结果是一样的。
谁能详细的解释一下么????
...全文
192 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝鹰 2011-09-21
  • 打赏
  • 举报
回复
int main()
{
float r,h,a;
printf("please input your numb:\n");
scanf("%f%f",&r,&h);
printf("%.2f %f\n",r,h);
a=PI*r*r*h;
printf("%.2f\n",a); //为什么两者得出结果不一致?
printf("%.2f\n",PI*r*r*h);
//下面进行验证:
printf("%.2f %.2f %.2f\n",PI*r,PI*r*r,PI*r*r*h);
printf("%f %f %f\n",PI*r,PI*r*r,PI*r*r*h);
system("pause");
return 0;
}
说也奇怪,运行这个程序你会发现,
最后两个printf所显示的结果为:
4.71 7.06 21.20
4.710000 7.065000 21.195000
按人的思维来7.06*3=21.18<21.195
真不知道它这里是怎么算的
赵4老师 2011-09-21
  • 打赏
  • 举报
回复
#define PI 3.14

#define PI 3.14f
不是一回事
wyfwx 2011-09-21
  • 打赏
  • 举报
回复
printf("%.2f\n",a); a是float
printf("%.2f",PI*r*r*h);PI*r*r*h是double
無_1024 2011-09-21
  • 打赏
  • 举报
回复
换成double
cocat 2011-09-21
  • 打赏
  • 举报
回复
应该就是double和float的一点问题~我反正在VC下是一样
basecoding 2011-09-21
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#define PI 3.14
int main()
{
float r,h,a;
scanf("%f%f",&r,&h);
a=PI*r*r*h; -> 两个float相乘,编译器内部会把其结果转换成double类型。这里你把结果赋值给float型,其实就是默认做了强制转换。
printf("%.2f\n",a);
printf("%.2f",PI*r*r*h); ->%f支持dobule类型
system("pause");
return 0;
}
所以结果不同,是很有可能的。
如果你把a类型换成double类型,输出结果应是一样的。
或者你把公式里面只保留一个r,输出结果也会是一样的。
aa752929383 2011-09-21
  • 打赏
  • 举报
回复
double和float的问题
zhaopeng2511 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 anyidan 的回复:]

scanf("%f%f",&r,&h); // 此处的 f -- float
a=PI*r*r*h; // -- 按float 运算

printf("%.2f",PI*r*r*h); // 此处的 f -- double ,按 double 运算
[/Quote]
正解++
「已注销」 2011-09-20
  • 打赏
  • 举报
回复
和编译器也有点关系吧
深度抽象 2011-09-20
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#define PI 3.14
int main()
{
double r,h,a;
scanf("%lf%lf",&r,&h);
a=PI*r*r*h;
printf("%.2lf\n",a);
printf("%.2lf",PI*r*r*h);
system("pause");
return 0;
}
blueapples0604 2011-09-20
  • 打赏
  • 举报
回复
float d;
double c;
d = 21.195;
c = 21.195;
printf("%.2f\n",d);
printf("%.2f\n",c);
结果21.19 21.20
float d;
double c;
d = 21.194;
c = 21.194;
printf("%.2f\n",d);
printf("%.2f\n",c);
结果21.19 21.29

结论,在double转float(小数点后取2位)时,4舍5入了
AnYidan 2011-09-20
  • 打赏
  • 举报
回复
a=PI*r*r*h; // -- 按double 运算, 转化 为 float
AnYidan 2011-09-20
  • 打赏
  • 举报
回复
scanf("%f%f",&r,&h); // 此处的 f -- float
a=PI*r*r*h; // -- 按float 运算

printf("%.2f",PI*r*r*h); // 此处的 f -- double ,按 double 运算
jackyjkchen 2011-09-20
  • 打赏
  • 举报
回复
各种编译器浮点模型不同,因此浮点的精度没有标准,也许换一个编译器甚至换个编译选项,就又是不同的结果了
奋发的小鸟 2011-09-20
  • 打赏
  • 举报
回复
我运行结果怎么是一样的
qq120848369 2011-09-20
  • 打赏
  • 举报
回复
因为float计算时候转成double了?

a=PI*r*r*h;

计算完又转回float了?
l369294289 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mengmingtao 的回复:]

float之间运算要转换成double类型进行~
[/Quote]
求详细解答
l369294289 2011-09-20
  • 打赏
  • 举报
回复
回2楼,只要把a改成double就行了,求详细过程,为什么是这样的。
l369294289 2011-09-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dizuo 的回复:]

float精度的问题,
#define PI 3.1415926
试试看。
[/Quote]
表示不是精度问题,是printf,float和double的问题,不懂,就详细指教
mengmingtao 2011-09-20
  • 打赏
  • 举报
回复
float之间运算要转换成double类型进行~
加载更多回复(2)

69,371

社区成员

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

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