printf函数输出单精度和双精度都是保留两位小数,为何结果不同???

#include<stdio.h>
#define pi 3.14
int main()
{
double r,h,s;
scanf("%lf%lf",&r,&h);
s=pi*r*r*h;
printf("%.2lf",s);
return 0;
}
以上程序的结果为:
输入
1.5 3
输出:
21.20

#include<stdio.h>
#define pi 3.14
int main()
{
float r,h,s;
scanf("%f%f",&r,&h);
s=pi*r*r*h;
printf("%.2f",s);
return 0;
}
以上程序的结果为:
输入
1.5 3
输出:
21.19
!!!!!!!!!!!!!!!!!!!!这是为什么呢?我知道单精度和双精度有区别,但是还是不知道为什么?

这不是printf的问题。在VC++6.0下,无论是float带是double都得结果21.20。在C中,float都自动提升到double来计算的,只是最后输出时精度不同。追问

本应该是21.195000的,float自动提升为double也不会有这种情况吧

追答

要求只保留两位小数,那么按规则取3位而后四舍五入,21.195000输出为21.20有什么错?你用printf("%.3f\n",21.195000);试试看是不是21.195?还可以用printf("%.2f\n",21.194999);看看是啥结果?

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-11-13
你好,这是因为 double 和 float 的输出精度不同,double 更精确点追问

我知道float和double的精度不同,可是我还是不明白啊,其实输出的是21.195000;难道是float保留两位小数时直接丢失,而double保留两位小数时,按四舍五入取舍吗?

追答

单精度float精确到6位,双精度double是15位,long double 是 17位
这个应该是和浮点型的存储形式有关系,是不是二进制形式存储方式不同,具体情况不太清楚了

printf函数输出单精度和双精度都是保留两位小数,为何结果不同???
这不是printf的问题。在VC++6.0下,无论是float带是double都得结果21.20。在C中,float都自动提升到double来计算的,只是最后输出时精度不同。

C语言中printf区分双精度和单精度吗?为什么用lf输出不了双精度浮点数...
如果用户在函数定义时定义为双精度,最后用printf输出时既可以用printf("%lf",a);也可以用printf("%f",a)输出。用"lf”输出不了双精度可能是用户定义时定义为单精度,那么可能不能用双精度输出。至于输出答案有时为正零有时为负零,那么可能是用户求出的答案超出精度范围了。

C语言中printf区分双精度和单精度吗?为什么用lf输出不了双精度浮点数...
哦,就是用双精度输出1.1吧···好像不论用单精度还是双精度都是保留小数点后六位,只是输出的数表示的范围比单精度大,在单精度可能溢出的数,在双精度下不会溢出···你用电脑是16位,32位还是64位的? 追问 我问题中的程序是用minGW编译的,没有按照期望输出1.132位系统. 更多追问 本回答由提问者推荐 举报| ...

C语言的单精度和双精度的尖端问题。
printf("结果是:%.2e\\n", a);浮点是由精度限制的。一个十进制数转换成2进制数可能会有很多位,但是float用4个字节表示,double用8个字节表示。float有32位,1位符号位,8位指数位,23位位数位。超过23位尾数位的尾数会被截断。显示的时候会把二进制的值再转换成十进制,结果就出现了差异 更具...

c++交换两个乘数的位置,计算结果取两位小数后为什么不同
m和n是两个不同表达式计算出来的,所以近似精度并不一致,所以不能认为6.3*12和84*0.9在内存中的表达是完全相等的。m和n手动算出来都是71.915,但内存中的表达上n的那个最后的5可能是比5还多一点被“四舍”得到的,而m的那个5可能是...49999999999...“五入”得到的,那么在代码由...

c语言里单精度和双精度怎么理解?
单精度和双精度顾名思义是两种精度的不同划分,单精度float是保证7位有效数字,double是保证16位有效数字。例:(float)(10%3)结果是1.000000即七位有效数字,(后面不一定全是0,计算机可随机选择数字,所以整数1不等于float或double的1)(double)(10%3)同理结果是:1.XXXXXXXXXX……后面有...

C语言程序设计问题:关于单精度和双精度输出位数问题……
32位环境printf的%f和%lf都是double,没有单精度的输出。f的默认小数位数就是6位不管有没有l。是float直接从十进制数字转换来的情况下十进制可靠有效数字是7位。float的有效数字永远是二进制24位。

为何单精度与双精度显示的数长短都为六个,但用时双单有区分,区分在哪里...
双精度double的有效位数是多于单精度float的,这里之所以你看到的结果都是六位,是因为你输出方式是单精度输出“%f”,如果改成双精度输出,你就会看到区别的了

c语言中printf语句以小数形式输出单、双精度实数的问题
对于这种带小数的就需要把整数部和小数部分开处理,其原理比较复杂几句话也说不清楚,但是精度差距就从这里产生了,所以出现这种误差实际是存储精度的问题。建议你可以用double等类型提高精度。如果你真的要详细了解的话可以查阅计算机组成原理中浮点数表示法部分就能很好理解了 ...

单精度实数和双精度实数有何区别在打印的结果上看,最好举例说明...
主要的区别在单精度的实数能保留两位小数如1.02,双精度实数可保留四位小数1.0002,所以在开始定义实数的类行时要分清,不然结果有时不一样。如 双精度实数=1.0002 输出的 单精度=1.00

相似回答