您的位置: 葫芦岛信息港 > 教育

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

发布时间:2019-04-11 09:50:02

近我在上闲逛的时候发现有很多用户都在反映一个非常惊悚的问题:使用Android内置的计算器时有些简单的减法都会算错,例如14..49,再例如8..96,具体结果各位友请赶紧拿出自己手上的Android算算吧,如果没有Android的话,那就只能看我来算了...

▲左边:14..49;右边:8..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位就可以了。

正向排列取得的整数:

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

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

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

竖向排列比较容易看

1000. -

0111.

==== 结果是 ====

0000.

然后将0000.重新转换成十进制

如何转换成10进制?

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

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

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

0000. = 0 + 1 2^-4 + 2^-7 = 0.

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

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

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

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

如果能以双精度52个数据位来计算,那结果就是:0.....羊皮革价格
..

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

▲百度计算器算8..96时的结果

猜你会喜欢的
猜你会喜欢的