濠滨论坛

点击扫描二维码

查看: 4138|回复: 31

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

[复制链接]

该用户从未签到

发表于 2015-10-7 22:53 | 显示全部楼层 |阅读模式 来自:江苏
Android 计算器惊现超级大 bug!在 Android 的计算器程序里输入 14.52 - 14.49,计算器竟然说它等于 0.0299999999!其实,这已经是计算机的老毛病了。计算机用二进制来表示数,将会不可避免地产生误差。) Y) V& n/ }" T- `
听说了 Android 的超级大 bug,我立即在自己的 HTC Hero 上试了一下,果然正如众人所说, 14.52 - 14.49 = 0.0299999999。稍作试验便可发现,一些更为简单的算式也会出现类似的问题,例如在 Android 计算器中输入 1.2 - 1.1,结果等于 0.0999999999。这是为什么呢?
& u6 F9 g! z3 W4 g# g$ V7 l0 A都是二进制惹的祸原来,在计算机内部,数字并不是用十进制来储存的,所有数字都是以二进制的方式储存的。但一个进制下的有限小数,很可能是另一个进制下的无限小数。比方说,把十进制小数 1.2 转换成二进制小数,将会得到一个无限循环小数 1.001100110011…;把 1.1 转换成二进制小数则是 1.0001100110011…,也是一个无限循环小数。计算机显然不能储存无穷多位数,因而不得不近似地截取有限多位。如果保留 52 位数的话,那么在计算机看来,1.2 - 1.1 其实是这样:- t! I$ U6 ^- C0 ^

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

/gkimage/4x/9g/4l/4x9g4l.png
问题出现了:在显示计算结果的时候,计算机需要把它转换回十进制。但上面的结果转换成十进制并不是精确的 0.1,而是一个 52 位小数 0.09999999999999986677323704 49812151491641998291015625。由于 2 的 -52 次方约为 10 的 -16 次方,也就是说 52 位二进制小数的精度大约相当于 16 位十进制小数,因此计算机上通常只保留这个小数的 16 位有效数字。因此,上面这个小数也就成了 0.09999999999999987。8 X- p, n1 U& R. X/ g
不只是 Android 的问题你会发现,这样的问题在电脑里到处都有。例如,在你的浏览器地址栏里输入
  1. . U7 |! x8 ^) j
  2. javascript:alert(1.2-1.1)
    " l5 u# ]4 {5 C2 `* P: g
复制代码
你就会看见这个诡异的答案:0.09999999999999987。即使是专业的数学软件中,小数精度的问题也是不可避免的。在 Mathematica 中输入 1.2 - 1.1,答案似乎是没错:) O- n+ F0 j: G  l* n+ d3 q) J

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

/gkimage/az/tm/0c/aztm0c.png
但是,输入 InputForm[%] 查看这个 0.1 的真身,你会发现原来它也不是精确的:
! u* c/ s' _7 l1 a* n0 s

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

/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 处理小数的算法也是在不断改进的。
南通0
匿名
发表于 2015-10-7 22:59 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-7 23:17 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-7 23:34 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-7 23:59 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 00:17 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 00:33 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 00:52 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 01:07 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 01:32 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 01:51 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 02:07 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 02:33 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2015-10-8 03:00 | 显示全部楼层 来自:江苏
你可以在问答的评论里面添加!只要你事先准备好,抢到1、2楼应该没问题。
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 03:24 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 03:51 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 04:10 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 04:38 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 04:58 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 05:27 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 05:49 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 06:17 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 06:34 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

匿名
发表于 2015-10-8 06:52 | 显示全部楼层 来自:江苏
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|无图版|站务联系 | 商务合作 | 平台公约

信息产业部备案:苏ICP备05014191号-1 经营性ICP许可证:苏B2-20110445 苏公网安备 32060202000307号 © 2001-2019 0513.org All Right Reserved.

投诉争议 技术支持:第一互联 GMT+8, 2025-12-19 04:15 , Processed in 0.176688 second(s), 15 queries , MemCache On. 站点统计

快速回复 返回顶部 返回列表