【ALLY】Android计算器Bug: 14.52-14.49=0.02999999  谁用Android系统的TX,试一下你们手机的计算器有没有这样的问题:14.52-14.49=0.02999999今天在公司看到关于这个的讨论,所以就把这个问题写到网上去。后来发现有同事研究出为什么出现这样的结果:
如下:14.52-14.49=0.02999999 14.52 = 0x0000000E851EB851
 14.49 = 0x0000000E7D70A3D714.52-14.49 = 0x0000000E851EB851 - 0x0000000E7D70A3D7 = 0x0000000007AE147A = 128849018 / 4294967295 = 0.029999999802093952848132223088325
建议将问题提到Android去修复这个bug,这样可能会让喜欢用Android计算器的TX免受一些微小的损失。

解决方案 »

  1.   

    嘿嘿,真的吔 这个应该是google的arity-2.2.1.jar的问题吧?
      

  2.   

    减法都算错? 技术帝为你解密Android计算器低级错误Bug
      

  3.   

    还有一个bug
    你可以试试:
    cos(√-1)
    这个应该返回error but 咱们的android会算出一个数值:
    1.54308063481
      

  4.   

    额~~~
    你发的我打不开~~~~~~~~~~·
    http://njcb.xhby.net/mp3/html/2011-05/11/content_362719.htm
      

  5.   

    忘了你只能上CSDN
    减法都算错? 技术帝为你解密Android计算器低级错误Bug
    文字&图片来源:it168       最近小编我在网上闲逛的时候发现有很多用户都在反映一个非常惊悚的问题:使用Android手机内置的计算器时有些最简单的减法都会算错,例如 14.52-14.49,再例如8.03-7.96,具体结果各位网友请赶紧拿出自己手上的Android手机算算吧,如果没有Android手机的话,那就只能看小编我来算了...
           如上面这张图,这个计算错误简直是让人匪夷所思,而且其实不止这两道题,会出现问题的数字还有很多很多。这万一要是kaoshi的时候偷偷作弊掏出来算个题目啥的,那还不直接补考补到死??话说kaoshi作弊是不对,不过这个问题的确很严重,而且根据我的调查,身边使用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 手机内置的计算器会出现这个问题,例如百度的计算器也会,而有些计算器能够得到相对精确的结果就是因为对算法进行了优化的结果。
          
      

  6.   

    好解决的,大数运算和精度问题,都是我们搞ACM的必须课,不过在NOI时就开始解决了,哈哈