如上面两张图,这个计算错误简直是让人匪夷所思,而且其实不止这两道题,会出现问题的数字还有很多很多。这万一要是考试的时候偷偷作弊掏出来算个题目啥的,那还不直接补考补到死??话说考试作弊是不对,不过这个问题的确很严重,而且根据我的调查,身边使用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手机内置的计算器会出现这个问题,例如百度的计算器也会,而有些计算器能够得到相对精确的结果就是因为对算法进行了优化的结果。
1 | 苹果 iPhone 4(16GB) | ¥4950 | 论坛 |
2 | 诺基亚 X7 | ¥3000 | 论坛 |
3 | 诺基亚 C5-03 | ¥1150 | 论坛 |
4 | 诺基亚 Vertu Constellati | ¥219400 | 论坛 |
5 | HTC 野火 A315c | ¥1600 | 论坛 |
6 | 诺基亚 N8 | ¥2900 | 论坛 |
7 | 诺基亚 C7 | ¥2150 | 论坛 |
8 | HTC Desire S(G12) | ¥2450 | 论坛 |
1 | HTC 野火 A315c | ¥1600 | 论坛 |
2 | HTC Desire S(G12) | ¥2450 | 论坛 |
3 | HTC Sensation(G14) | ¥3300 | 论坛 |
4 | 诺基亚 N9 64G | ¥4850 | 论坛 |
5 | 三星 i9100(16GB) | ¥4160 | 论坛 |
6 | HTC Wildfire S(G13) | ¥1700 | 论坛 |
7 | 诺基亚 N8(粉色) | ¥2650 | 论坛 |
8 | 三星 C6712 | ¥1100 | 论坛 |
1 | 三星 i9100(16GB) | ↘340 | 论坛 |
2 | 诺基亚 E7 | ↘250 | 论坛 |
3 | 诺基亚 C6 | ↘250 | 论坛 |
4 | HTC 野火 A315c | ↘200 | 论坛 |
5 | 诺基亚 X7 | ↘120 | 论坛 |
6 | HTC Sensation(G14) | ↘100 | 论坛 |
7 | HTC 惊艳 S710d | ↘100 | 论坛 |
8 | 摩托罗拉 Atrix 4G | ↘100 | 论坛 |