最近一个朋友在技术群里问了一个问题。 大意 就是 100 × 0.01 打印 出来 竟然是0。 下面是他的代码
int _tmain(int argc, _TCHAR* argv[])
{
int i = 100;
float f = 100 * 0.01;
printf("%d",f);
return 0;
}
聪明的同学可能发现了其中的端倪,错误发生在
printf("%d",f);
错误的将 float 用 整形的 方式 打印出来。
可是 为什么 1.0 用 %d 的方式 打印出来 是 0 ,为什么不是 1,这就要从 int 和 float 的 内存 存储方式 说起。
int 在内存中是 用 补码的方式 存储的 ,即 符号位 + 值 , 符号位 为0,表示整数,符号位为1,表示负数。
float 在内存中的 存储方式是 用 指数的 形式 存放的。 即 符号位+ 指数位 + 小数位。
打印1.0 的指数行书:
printf("%e",1.0);
1.0 的符号位 为 0 ,指数为 0, 小数位 为 1.000 ,真正存储的时候 是 不存储 1 的。 只存储 小数点 后面的 数。
所以 1.0 在 内存的 存储 就是 32个0 , 按整形方式 打印出 0 ,就 一点 都 不足为奇了。
浮点数存储详解网址:http://shatler.iteye.com/blog/649896