计算机运算出错的原因,在了解了将二进制数表示的小数转换成十进制数的方法后,计算机运算出错的原因也就容易理解了。这里我先把答案告诉大家,计算机之所以会出现运算错误,是因为“有一些十进制数的小数无法转换成二进制数”。例如,十进制数0.1,就无法用二进制数正确表示,小数点后面即使有几百位也无法表示。接下来,我们就来看一下不能正确表示的原因。
图3-2中,小数点后4位用二进制数表示时的数值范围为0.0000~0.1111。因此,这里只能表示0.5、0.25、0.125、0.0625这四个二进制数小数点后面的位权组合而成(相加总和)的小数。将这些数值组合后能够表示的数值,即为表3-1中所示的无序的十进制数。
表3-1 小数点后4位能够用二进制数表示的数值二进制数是连续的,十进制数是非连贯的
表3-1中,十进制数0的下一位是0.0625。因此,这中间的小数,就无法用小数点后4位数的二进制数来表示。同样,0.0625的下一位数一下子变成了0.125。这时,如果增加二进制数小数点后面的位数,与其相对应的十进制数的个数也会增加,但不管增加多少位,2的-〇〇次幂怎么相加都无法得到0.1这个结果。实际上,十进制数0.1转换成二进制后,会变成0.00011001100…(1100循环)这样的循环小数。这和无法用十进制数来表示1/3是一样的道理。1/3就是0.3333…,同样是循环小数。
至此,大家应该明白了为什么用代码清单3-1的程序无法得到正确结果了吧。因为无法正确表示的数值,最后都变成了近似值。计算机这个功能有限的机器设备,是无法处理无限循环的小数的。因此,在遇到循环小数时,计算机就会根据变量数据类型所对应的长度将数值从中间截断或者四舍五入。我们知道,将0.3333…这样的循环小数从中间截断会变成0.333333,这时它的3倍是无法得出1的(结果是0.999999),计算机运算出错的原因也是同样的道理。
酷客网相关文章:
评论前必须登录!
注册