什么?计算机也会算错数?( 二 )


让我们回想一下小学的数学知识, 在十进制中, 如果要用有限小数来表示一个分数的值, 那么这个分数的分母(化简之后)一定不能包含除了2和5以外的其他质因数, 因为十进制以10来分割数轴, 而10分解质因数的结果为2×5 。 举个例子:1/8、1/10、1/25都可以换算成有限小数(分别是0.125、0.1、0.04), 因为这些分数的分母分解质因数之后只包含2或者5(8=2×2×2、10=2×5、25=5×5), 而当分母包含其他质因数时, 例如1/3、1/7、1/18这些则无法用有限小数来表示(也就是俗话说的“除不尽”) 。 如果我们把这个规律套用到二进制上会怎么样呢?2本身就是一个质数, 无法分解质因数了, 因此在二进制中, 如果要用有限小数来表示一个分数的值, 那么这个分数的分母一定只能包含2这一个质因数, 换句话说, 分母必须为2的幂(2、4、8、16、32……) 。
好了, 我们回头看看开头的题目, 0.1换算成分数就是1/10, 而1/10的分母是10, 10并不是2的幂, 因此, 在二进制中并不能用有限小数来表示1/10这个值 。 事实上, 如果将0.1转换成二进制, 我们会得到一个无限循环小数:0.000110011001100……看到这里, 很多人估计已经想明白了, 没错, 计算机的精度是有限的, 并不能直接处理无限小数, 对于无限小数必须要截短到某个位置把它变成有限小数, 但截短之后这个数就不准了, 必然就产生了一点误差, 而连续加10次会将这种误差放大, 当误差被放大到一定程度时, 计算的结果就会出问题了, 于是我们就看到了开头的那一幕 。 如果用十进制来类比的话, 大家可以想象一下, 1/3+1/3+1/3=1, 但1/3只能用无限循环小数来表示, 即0.333333……, 如果我们将它截短到某一位, 假设截到0.333, 那么0.333+0.333+0.333=0.999, 你看, 同样也会出问题 。
问题的原因总算搞清楚了, 不过感觉很坑爹啊, 计算机居然算不准小数, 但为什么平时大家很少因此遇到问题呢?那是因为大多数用户都不用编写程序, 但对于整天编写程序的程序员来说, 这样的问题其实经常遇到 。 比如说, 如果你在一段程序中需要让计算机判断0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1是否等于1, 计算机会告诉你不等于1, 坑爹吧?如果这段程序涉及到算钱, 有时候就会错得很离谱, 因此有经验的程序员在碰到小数计算的时候都会特别小心 。 当然, 作为一般用户我们平时根本不需要关心这样的问题, 不过计算机居然会算错数, 怎么想都觉得挺奇妙的吧?

以上内容就是什么?计算机也会算错数?的内容啦, 希望对你有所帮助哦!

推荐阅读