关于单精度实数,双精度实数的几个问题!!(初级问题)
main()
{
float x,y;
x=111111.111,y=222222.222;
printf( "%f\n ",x+y);
printf( "%f %f\n ",x,y);
}
计算机输出的结果为:
333333.328125
111111.109375 222222.218750
我以为结果会有2种:
第一种直接输出:
333333.333
111111.111 222222.222 (这种结果是我最开始想的,后来看书知道float的有效位只有7位,所以我又想到了下面的结果)
第二种float的有效位数只有前7位,那么我认为结果应该是:
333333.3
111111.1 222222.2 (如果那个 ". "不算一个位的话)
下面还有个double的类型,问题一样
main()
{
double x,y;
x=1111111111111.111111111,y=2222222222222.222222222;
printf( "%f\n ",x+y);
printf( "%f %f\n ",x,y);
}
计算机输出结果:
3333333333333.333010
1111111111111.111080 2222222222222.222170
就是和我以为的不一样,请大家指点!!
[解决办法]
因为无论float 7有效或 double 16有效,没限定小数点后面几位都是输出6个小数。
另外也不会4舍5入
[解决办法]
单精度类型的二进制位只有32位,这制约了它的精度范围,也就是说会进行截短,损失精度
double的问题同样是这样
[解决办法]
计算机保存数字不像人脑,你说3,就是3.
说2.5就是2.5.
将2.5转换为2进制数后,它的最小单位就是位了.
一个float一般是4个字节,32位.
有效位7位,小数点后默认6位,多的都给砍掉了.
当你再次输出时就不是那么多了.
[解决办法]
float 一般是6位小数了