C语言实型变量float、double、long double变量类型为什么显示的时候差别这么大?

关于变量类型的问题小弟不是很明白,请各位大侠指教。
#include<stdio.h>
int main()
{
float fFloatStyle = 987654321.123456789;
double dDoubleStyle = 987654321.123456789;
long double lDoubleStyle = 987654321.123456789;
printf("%f\n",fFloatStyle);
printf("%f\n",dDoubleStyle);
printf("%f\n",lDoubleStyle);
return 0;
}

首先搞清楚计算机是用二进制存储形式存储内容的,一个字节是8个二进制位。一个float、double、long double类型即单精度浮点类型、双精度浮点类型和长双精度浮点类型在32位系统下面的存储空间分别为4字节、8字节和12字节,也就是32个二进制位、64个二进制位和96个二进制位,因此他们能保存的小数点后面的位数的能力也是大相径庭的,位数越多能保存的小数点后面的位数也就越多,位数不够保存不了的计算机会自动舍弃后面几位!这样也就能解释你的问题啦。不好意思啊,解释得不是很专业不过应该是能懂的就行啦~追问

我用三种不同实型变量去显示这个数987654321.123456789,要说计算机自动舍弃后面几位为什么只有double类型的显示的比较正确,为什么float类型显示的是97654336.000000,而long double则直接显示的是负数,还这么长的0?

追答

这个问题还是跟浮点精度有关,首先你是用%f打印而不是%g,不会自动舍弃小数点后无效的零。你这个float打印出来确实有点问题,可能是计算机的原因,你可以单独拿出来打印看看是不是这个结果,一般来说float也是精确到后几位的,不会后面都是零的。还有那个long double 就是涉及到计算机存储数据和读取的方式了,因为计算机使用二进制存放数据,你输入的是个大值正数,计算机存储时会1111111 ... ...这样存储(具体我也没算,这个数太大)这样因为你选择的是有符号类型,计算机会误以为是个负数,把前面的1111111... ...都当成是负数的符号位,所以数出来的是负数,你改成无符号类型这种情况就不会发生了。你可以试试unsigned~

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-23
#include<stdio.h>
int main()
{
float fFloatStyle = 987654321.123456789;
double dDoubleStyle = 987654321.123456789;
long double lDoubleStyle = 987654321.123456789;
printf("%f\n",fFloatStyle);
printf("%f\n",dDoubleStyle);
printf("%lf\n",lDoubleStyle);
return 0;
}
float 数字范围是-3.4*10(-38)----- 3.4 * 10 (38)
double -1.7 * 10(-38)-----1.7 * 10(308)
long double -1.2 * 10 (-4932) -------1.2 * (104932)
其中括号表示次方

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网