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 其实是这样:

/gkimage/4x/9g/4l/4x9g4l.png

问题出现了:在显示计算结果的时候,计算机需要把它转换回十进制。但上面的结果转换成十进制并不是精确的 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,答案似乎是没错:

/gkimage/az/tm/0c/aztm0c.png

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

/gkimage/pd/w5/ns/pdw5ns.png

也就是说,Mathematica 发现这个小数太接近 0.1,便猜测这个数真的就是 0.1,于是智能地帮我们化简了。很多计算器类的软件也有自动化简的功能,只是 Android 上的计算器做得似乎还不够好,偶尔会出现失误罢了。

其实,这个问题还不算离谱。在我的 Android 手机上输入 1.2 - 1.1 - 0.1,会得到一个更加诡异的结果:-1.38777E-16,也就是 -1.38777 × 10 -16 。这也是由于二进制表达的误差造成的。不过,较新的 Android 系统上似乎没有出现这个问题,可见 Android 处理小数的算法也是在不断改进的。

更多相关文章

  1. Android studio简单计算机
  2. android edittext 限制输入框小数位数
  3. Android简易计算器(破烂Alpha版,后续更新)
  4. android之简单的计算器样式界面
  5. Android简单计算器界面实现
  6. Android Studio计算器 app
  7. Android studio制作计算器源代码
  8. Android表达式计算器

随机推荐

  1. windows系统上使用Android(安卓)NDK r5
  2. windows下配置android源码获取环境
  3. 6.腾讯微博Android客户端开发——换取Acc
  4. Android(安卓)Notes 之 RecyclerView 的
  5. 高德地图缩放级别对应的比例尺
  6. Andriod开发——页面布局的学习
  7. android nfc NDEF的RTD_TEXT读写
  8. Android4.0(Phone)来电过程分析
  9. Android结合ButterKnife创建自己的BaseAc
  10. android自定义控件打包成jar文件