首先,要了解浮点数是以IEEE754标准转化为二进制代码存储在计算机中的,他的这种存储编码导致了不管是float还是double都无法精确的存储一个浮点数
比如说 x=6.234; 逻辑上讲,那x就等于6.234,但是是不对的,浮点数的存储编码的缺陷导致真正存入计算机的可能是非常接近6.234的一个浮点数,比如6.23999999999 当然也可能是6.2340000000001
由于浮点数无法精确存储,引发了两个编程问题
1. 一个浮点型的变量X,怎么判断X值是否为0 ? 因为真正存入计算机的浮点数都是一个近似值
解决方法: if(|X-0.000001|<0.000001)
是0
else
不是0
2.为什么循环更新的变量不能定义成浮点型?- float i;
- float sum=0;
- for(i=1.0;i<=100;++i){ // 如果 i 是浮点型,最后一次的i很可能是100.00000001 就少了一次循环
- sum=sum+1/i;
- }
复制代码 逻辑上讲这段代码是没有错误的,但是由于浮点数无法在计算机中精确存储,所以这段代码就变的有问题了。。 |