8.03减去7.96等于多少?答案是0.07。14.52减去14.49等于多少?答案是0.03。
这道简单的小数减法题,相信很多小学生都可以很快、很轻易、很从容地解答出来,但让人想不到的是,一部分智能手机却在这个算术题上栽了大跟头。
智能手机的低级错误
近日,一位使用智能手机的用户在网上贴出截图,展示用手机自带的计算器计算8.03减去7.96的结果。图片显示,手机算出来的结果不是0.07,而是0.0699999。这个不大不小的“错误”,引发了网友们的讨论:“高科技产品把简单算术题都算错了,太匪夷所思了。”半信半疑地掏出手机、谨慎地输入数字、轻轻地按一下“=”键,没错,结果就是0.0699999。
一位网友还惊奇地发现,不光是这一个减法题,用14.52减去14.49时,得出的结果也不是0.03,而是0.0299999。还有网友表示,百度计算器也有同样的问题,14.52-14.49=0.02999999999。同时,也有网友表示,自己的手机在做这些题目时“丝毫没有压力”,“我用的是苹果手机,一点都没错啊”。
针对这种个体差异,网友们在归纳众多“试机”的结果后,总结出了一致的结论:使用安卓系统的智能手机,在用手机自带计算器时,便会出现小数减法计算出错的问题。但很快,就有网友推翻了这个结论。一个网友称,自己安卓2.1系统的三星手机计算出来是正确的,没有出现问题;那么,安装安卓2.2系统的手机呢?有的网友算出来是0.03,有的网友则是0.02999999999。
随后,记者测试了HTC等多款使用安卓系统的智能手机,发现这两道题的错误率是100%,而使用其他系统(塞班、iOS、WM7)的手机计算出来的都是正确答案。让人奇怪的是,测试安卓手机时,记者发现其他的百分位出现的小数减法题却很少出现错误,难道安卓系统只对这两道题有“知识盲点”吗?
业内人士也有点犯糊涂
随后,记者先联系上了业内人士小曾。“这应该是安卓计算器的bug(错误)吧?”小曾说。当被问及为何会出现这样的BUG时,小曾停顿了一会,然后说:“稍等,我和同事讨论一下。”5分钟后,小曾解释:“是计算器使用的数据位精度过高导致的。”
小曾解释,之所以塞班、iOS系统的智能手机不会出错,是因为有个优化的措施。“安卓系统版本更新太频繁,所以会有一些BUG。”
一家大型IT公司的业务主管徐先生则表示,其实,在这个问题上,安卓系统一直在犯错误,“版本更新了很多次,但这个BUG一直存在”。徐先生还表示,其实,这个小小的错误并不是无法攻克的,自己也不明白那些高科技人才为什么“知错不改”。“呵呵,我只能说,这是一个张扬个性的时代,这或许是个性的体现吧。”
资深程序员告诉你原因
南京小伙子朱宁,在新加坡一家软件公司任职多年。昨天,记者特意采访了朱宁,询问安卓计算器算错的原因。
在听到记者的描述以后,小朱立刻表示,这其实是目前计算机技术的局限性导致的,并不只是安卓系统特有的bug。
小朱说,其实计算器在做这样的加减乘除的运算时,并不是直接把数字进行相加,而是要先转换成二进制的数字,之后再进行运算。
“我们人类的算术,有十个数字,从0到9,这个就是十进制,而在计算机的世界里,就只有0和1两个数字,这就是二进制。”小朱说,这个转换的过程,详细来说,就是一个数字的整数部分除以2,取余数;小数部分乘以2取整数的方法。
以14.52为例,整数部分是14:
14/2=7余0
7/2=3余1
3/2=1余1
1/2=0余1
所以,14在二进制里就是1110。
小数部分是0.52:
0.52×2=1.04 整数1
0.04×2=0.08 整数0
0.08×2=0.16 整数0
0.16×2=0.32 整数0
小数部分和整数部分略有不同,小数部分很可能无穷无尽,但为了方便起见,我们只进行4次运算,于是,我们得到小数部分的结果是1000。
所以,14.52在二进制里是1110.1000
以此类推,14.49在二进制里是1110.0111
这样,14.52-14.49通过二进制运算就是1110.1000-1110.0111=0.0001
然后,我们再把它转换回十进制(二进制转换为十进制的公式为:ABC.XYZ=A×2"2+ B×2"1+C×2"0+X×2"-1+Y×2"-2+Z×2"-3,计算时,把相应的数字替换公式中的A、B、C等符号),得到的结果是0.0625。
可能有细心的读者已经发现,我们得到的结果竟然与真实的结果相差巨大,甚至比安卓的计算器还要糟糕。难道我们的算法错了?其实不然,小朱说,这与我们在小数部分进行运算的次数有关。如果我们多运算几次,精确度就会大为提高。像安卓计算机里得到的0.02999999的数字,基本上我们在小数部分计算到接近30次以后,就可以实现。
这不是安卓才有的bug
小朱说,之前我们已经提到,这个在当今的计算机领域几乎无法避免,但我们也可以通过一些技术手段来进行规避,比如,可以把有小数点的数字先放大,把它变成整数进行运算,之后再除以相应数字,最终就会得到精确的结果;或者事先确定要精确到的位数,然后计算到这一位之后,进行四舍五入,效果也是一样的。
在采访中,记者发现,这个问题并非安卓的计算器独有,包括百度计算器,甚至是Windows操作系统自带的计算器,也会出现这样的现象。朱宁表示,那些能得到精确结果的计算器很可能就是利用了上面的方法,进行了优化。“平时碰到了也不要大惊小怪,就当个笑话吧。”他说。(《南京晨报》)