Android计算器低级错误

Android计算器低级错误?

Android 计算器惊现超级大 bug!在 Android 的计算器程序里输入 14.52 - 14.49,计算器竟然说它等于 0.0299999999!其实,这已经是计算机的老毛病了。计算机用二进制来表示数,将会不可避免地产生误差。

听说了 Android 的超级大 bug,我立即在自己的 HTC Hero 上试了一下,果然正如众人所说, 14.52 - 14.49 = 0.0299999999。稍作试验便可发现,一些更为简单的算式也会出现类似的问题,例如在 Android 计算器中输入 1.2 - 1.1,结果等于 0.0999999999。这是为什么呢?

都是二进制惹的祸

原来,在计算机内部,数字并不是用十进制来储存的,所有数字都是以二进制的方式储存的。但一个进制下的有限小数,很可能是另一个进制下的无限小数。比方说,把十进制小数 1.2 转换成二进制小数,将会得到一个无限循环小数 1.001100110011 ;把 1.1 转换成二进制小数则是 1.0001100110011 ,也是一个无限循环小数。计算机显然不能储存无穷多位数,因而不得不近似地截取有限多位。如果保留 52 位数的话,那么在计算机看来,1.2 - 1.1 其实是这样:

问题出现了:在显示计算结果的时候,计算机需要把它转换回十进制。但上面的结果转换成十进制并不是精确的 0.1,而是一个 52 位小数 0.09999999999999986677323704

49812151491641998291015625。由于 2 的 -52 次方约为 10 的 -16 次方,也就是说 52 位二进制小数的精度大约相当于 16 位十进制小数,因此计算机上通常只保留这个小数的 16 位有效数字。因此,上面这个小数也就成了 0.09999999999999987。

不只是 Android 的问题

你会发现,这样的问题在电脑里到处都有。例如,在你的浏览器地址栏里输入

javascript:alert(1.2-1.1)

你就会看见这个诡异的答案:0.09999999999999987。即使是专业的数学软件中,小数精度的问题也是不可避免的。在 Mathematica 中输入 1.2 - 1.1,答案似乎是没错:

但是,输入 InputForm[%] 查看这个 0.1 的真身,你会发现原来它也不是精确的:

Android计算器低级错误相关文档

最新文档

返回顶部