Android计算器低级错误?都是二进制惹的祸!

标签: android 计算器 错误 | 发表时间:2011-05-09 10:01 | 作者:(author unknown) maxiyun
出处:http://www.guokr.com/

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 处理小数的算法也是在不断改进的。

相关 [android 计算器 错误] 推荐:

Android计算器低级错误?都是二进制惹的祸!

- maxiyun - 果壳网 guokr.com - 果壳网
Android 计算器惊现超级大 bug. 在 Android 的计算器程序里输入 14.52 - 14.49,计算器竟然说它等于 0.0299999999. 其实,这已经是计算机的老毛病了. 计算机用二进制来表示数,将会不可避免地产生误差. 听说了 Android 的超级大 bug,我立即在自己的 HTC Hero 上试了一下,果然正如众人所说, 14.52 - 14.49 = 0.0299999999.

优秀的Android计算器

- 李龑 - Solidot
Paul Power 写道 "计算器是操作系统自带的基本工具之一. 这些简单的工具提供了满足基本需求所需的足够功能. 但Android设备自带的计算器功能相当有限,仅提供了基本的加减乘除和括号等功能. 这篇介绍了十多款功能丰富的优秀计算器,其中部分还能绘制2D和3D图形,处理复杂的数学函数. 利用这些工具,Android智能手机能变成可随时使用的图形计算器.

Android NDK开发Crash错误定位

- - 极客521 | 极客521
在Android开发中,程序Crash分三种情况:未捕获的异常、ANR(Application Not Responding)和闪退(NDK引发错误). 其中 未捕获的异常根据logcat打印的堆栈信息很容易定位错误. ANR错误也好查,Android规定,应用与用户进行交互时,如果5秒内没有响应用户的操作,则会引发ANR错误,并弹出一个系统提示框,让用户选择继续等待或立即关闭程序.

Android 应用中十大常见 UX 错误

- - 互联网的那点事
Android 开发者关系团队每天都会试用无数的 App 或者受到无数的开发者发来的请求评测的 App,在评测如此之多的应用之后,他们总结出了10个最常见的错误. 作为一个长期使用 Android 的用户,我在使用 Android 应用的时候经常遇到各种各样的交互上的问题,并且早就想整理它们写一篇文章了.

Android 应用中十大导航设计错误

- - 极客公园-GeekPark
曾经热爱 Metro UI, 对 Android Design 了解深入. [核心提示]这一次,我们就设计错误的话题展开,指出一些大家在安卓开发领域设计应用导航时经常被犯下的错误以便更好的避免他们. 大家好,这里是 2014 年第一期正式的 ADiA 教程. 在上一次的 设计错误文章里,我们已经简略的提过了一下导航设计上的错误,这一次,我们就这个话题展开,指出一些大家在设计应用导航时经常被犯下的错误以便更好的避免他们.

钢琴计算器

- 丑秋 - 专利之家-设计发明与创意商机
这款太阳能计算器别出心裁地设计了黑白相间的按键,看起来像钢琴的琴键一样,十分有趣. 或许这样的计算器可以给枯燥的计算工作增添一点乐趣,让它不再乏味.

Oracle错误代码

- - 数据库 - ITeye博客
ORA-00001: 违反唯一约束条件 (.). ORA-00017: 请求会话以设置跟踪事件. ORA-00018: 超出最大会话数. ORA-00019: 超出最大会话许可数. ORA-00020: 超出最大进程数 (). ORA-00021: 会话附属于其它某些进程;无法转换会话. ORA-00022: 无效的会话 ID;访问被拒绝.

支持中文的计算器,才是好计算器!

- OrcaXS - I'm TualatriX
关心自由软件世界动态的朋友最近一定听说了Debian社区闹了个中文名“蝶变”的事情了,一开始我就觉得很好笑,所以没有去关心,我只关心我那个“会吐核的终端”. 今天啊,更好笑的事情发生了,那就是我居然发现了支持中文的计算器. Ubuntu 11.04下的计算器:gcalctool,竟然几乎彻底的本地化了.

10大经典错误

- beralee - 酷壳 - CoolShell.cn
下面是10、11个经典的错误,升序排名. 10、DOS的Abort,Retry, Fail. 85年以后出生的人可能不知道DOS是什么了,只有那老家伙还知道这是什么. 我还记得当时的我对于Abort和Fail这两个选择还是比较清楚的,不过,今天完全忘记了Abort和Fail的差别是什么. 这个出是DOS下的经常出现,也相当的经典,以至于在Wikepedia上都有专门的业面 Abort, Retry, Fail?.

Google Realtime出现404错误

- lube - Solidot
hidenosense 写道 "我的Google搜索页面左边工具栏里的realtime没了. 直接打开http://www.google.com/realtime返回404.