#include "stdAfx.h"
int main(int argc, char* argv[])
{
float a=123456.789e5, b;
b=a+20;
printf("a=%f b=%f\n",a,b);
printf("a=%f b=%f\n",a,b);
return 0;
}
为什么输出结果为 a=12345678848.000000,b=12345678868.000000
a=12345678848.000000,b=12345678848.000000
float类型数据只有前6位是精确的,从第七位开始都是由“四舍五入”获得的。
两个printf()函数的输出结果的差异发生在第十位,所以说,这两组数据都是“对”的。
下面把float改为double(当然输出格式也做了相应的修改),两组输出结果是相同的,原因在于,double类型数据的前16位是精确的。
/*
a = 12345678900.000000 b = 12345678920.000000
a = 12345678900.000000 b = 12345678920.000000
Press any key to continue
*/
#include <stdio.h>两次结果为什么不一样呢
追答简单说就是你的数值输出结果要求已经超出你的float有效值了 任何数据类型都不能存储超过这个类型本身能表达的数字 float是32bit的类型 32位的数据最大只能表达0~4294967295(无符号型)的数字范围 你上面的赋值已经是百亿级别了 float有保留了小数位 剩下的就放你的整数位数据 超出了它所能表达的范围就把高位数保留了,低位数(如个位、十位、百位数)则丢弃 printf的时候后面舍弃的低位数无法获知(保存到内存时丢弃了)那么就是随机的了(说是随机其实和在寄存器内的运算有关)