关于变量类型的问题小弟不是很明白,请各位大侠指教。
#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;
}
我用三种不同实型变量去显示这个数987654321.123456789,要说计算机自动舍弃后面几位为什么只有double类型的显示的比较正确,为什么float类型显示的是97654336.000000,而long double则直接显示的是负数,还这么长的0?
追答这个问题还是跟浮点精度有关,首先你是用%f打印而不是%g,不会自动舍弃小数点后无效的零。你这个float打印出来确实有点问题,可能是计算机的原因,你可以单独拿出来打印看看是不是这个结果,一般来说float也是精确到后几位的,不会后面都是零的。还有那个long double 就是涉及到计算机存储数据和读取的方式了,因为计算机使用二进制存放数据,你输入的是个大值正数,计算机存储时会1111111 ... ...这样存储(具体我也没算,这个数太大)这样因为你选择的是有符号类型,计算机会误以为是个负数,把前面的1111111... ...都当成是负数的符号位,所以数出来的是负数,你改成无符号类型这种情况就不会发生了。你可以试试unsigned~
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)
其中括号表示次方