慧聪网首页慧聪IT网首页行业资讯技术中心产品透视热点人物热点专题专家在线市场研究找供应找求购免费注册立即登录加入买卖通即时沟通网站导航

慧聪IT网

减法都算错?安卓惊爆计算器低级错误Bug

2011/3/21/8:54来源:IT168.com作者:刘致远
    最近小编我在网上闲逛的时候发现有很多用户都在反映一个非常惊悚的问题:使用Android手机内置的计算器时有些最简单的减法都会算错,例如14.52-14.49,再例如8.03-7.96,具体结果各位网友请赶紧拿出自己手上的Android手机算算吧,如果没有Android手机的话,那就只能看小编我来算了...

10以内加减法都算错?安卓惊爆低级错误10以内加减法都算错?安卓惊爆低级错误
▲左边:14.52-14.49;右边:8.03-7.96

  如上面两张图,这个计算错误简直是让人匪夷所思,而且其实不止这两道题,会出现问题的数字还有很多很多。这万一要是考试的时候偷偷作弊掏出来算个题目啥的,那还不直接补考补到死??话说考试作弊是不对,不过这个问题的确很严重,而且根据我的调查,身边使用Android手机的人也基本上都出现了这个问题。真的是google的开发人员犯了如此低级的错误吗?还是另有隐情?请大家关注本期走进科学...

  开个玩笑,小编我在发现这个问题之后立马进行了大量的查证,具体是为啥呢?还是谷歌大神万能:首先,在我们进行四则运算时计算机需要将十进制的数转换成二进制,并且因为有小数,所以采用浮点数的方式存储。如何怎么转换成二进制?计算方法如下:

  整数部分采用 除2 取余数;小数部分采用 乘2 取整数。

  以8.03为例:

  整数部分:

  8/2 = 4 余 0

  4/2 = 2 余 0

  2/2 = 1 余 0

  1/2 = 0 余 1

  倒序排列取得的余数:1000

  小数部分:

  0.03 × 2 = 0.06 整数 0

  0.06 × 2 = 0.12 整数 0

  0.12 × 2 = 0.24 整数 0

  0.24 × 2 = 0.48 整数 0

  0.48 × 2 = 0.96 整数 0

  0.96 × 2 = 1.92 整数 1

  0.92 × 2 = 1.84 整数 1

  0.84 × 2 = 1.68 整数 1

  小数部分几乎无穷无尽,但为了方便起见,我们只取前8位就可以了。

  正向排列取得的整数:00000111

  好了,8.03的二进制表示就是1000.00000111

  同理,7.96的二进制表示就是0111.11110101

  其次,有了2个数的二进制表示,然后就可以相减了:1000.00000111 - 0111.11110101

  竖向排列比较容易看

  1000.00000111 -

  0111.11110101

  ==== 结果是 ====

  0000.00010010

  然后将0000.00010010重新转换成十进制

  如何转换成10进制?

  有个公式可以用:假设有二进制数 ABC.XYZ ,转换成10进制的值为

  ABC.XYZ = A×2^2 + B×2^1 + C×2^0 + X×2^-1 + Y×2^-2 + Z×2^-3 (^ 这个是幂运算符号,这个公式适用于任何进制转换成十进制,只需将底数替换成相应的进制就可以了)

  通过这个公式,我们我们可以将二进制数的每一位对应转换成十进制,然后相加,就得到最后的结果了。

  0000.00010010 = 0 + 1×2^-4 + 2^-7 = 0.0703125

  好了,现在很清晰了,计算机得出的最终结果是0.703125,而不是0.7!!!

  似乎和计算器中0.06999999有点不一样?

  没错,因为我们的精度不够:刚开始的时候,我们只取了8位二进制小数!

  如果我们能以单精度23个数据位来计算的,结果是:0.06982421875

  如果能以双精度52个数据位来计算,那结果就是:0.06999999......  

  简单的来说就是,由于咱们目前计算机技术的原因,这个问题是必然会出现的,而且这个问题在目前还无法从根本上解决,但可以通过某些技术手段来进行规避,例如在进行小数运算时先乘以100或者更大的数字来将其转换为整数,在运算完成后再除以相应的数字来得到精确的结果。最后,小编发现并不只是Android手机内置的计算器会出现这个问题,例如百度的计算器也会,而有些计算器能够得到相对精确的结果就是因为对算法进行了优化的结果。

10以内加减法都算错?安卓惊爆低级错误
▲百度计算器算8.03-7.96时的结果

关注排行

  • 今日
  • 本周
  • 本月
  • 健康指南