我们输入的十进制小数在计算机中都是以二进制进行存储。比如:
我们把0.25转换为二进制 0.25 * 2 = 0.5 取0 0.50 * 2 = 1.0 取1 所以十进制0.25的二进制应当为0.01 但是我们把0.3转换为二进制存储 0.3 * 2 = 0.6 取0 0.6 * 2 = 1.2 取1 0.2 * 2 = 0.4 取0 0.4 * 2 = 0.8 取0 0.8 * 2 = 1.6 取1 0.6 * 2 = 1.2 取1 0.2 * 2 = 0.4 取0 ...... 所以十进制0.3的转为二进制应当为0.01001100110011的无限循环小数。
由此可见0.3在计算机中存储的值永远小于0.3,所以当使用0.3计算时,就会产生误差。
在计算机中浮点型不能直接使用等号比较也是同一个道理。举个李子:
#include<stdio.h> void comp(double a, double b){ printf("两个数:a = %g, b = %g 开始比较\n", a, b); if(a == b){ printf("a equal b\n"); } else{ printf("a not equal b\n"); printf("a - b = %g\n", a - b); } } int main(){ comp(0.25 + 0.25 + 0.25 + 0.25, 1.0); comp(0.3 + 0.3, 0.6); comp(0.3 + 0.3 + 0.3 + 0.1, 1); return 0; }
执行结果:
可以看出当涉及到0.3的运算超出一定的精度后,就会计算错误。
这就是为什么浮点型运算在计算机中会存在误差的原因。