之前在这篇文章中解释了0.1+0.2为什么不等于0.3而等于0.30000000000000004的原因,根源问题还在于存储精度的问题,当时只是简单觉得丢失精度后的行为是理所当然的,并没有丢失精度后是如何处理的,下面就来分析一下:
那么下面表达式的值呢:
可能一开始你会想当然得认为上面的值是:9007199254740994,因为精度不到,所以就把这位丢弃,然而,确切的结果是:
之前我们说到有这么一个公式(注意,这里是二进制运算,那个2的N次方可以理解为十进制的10的N次方):
所以最终结果就是M的小数点往右移动52位的结果.
可以看到最后一位多了一个1
最终结果也就是M往右移动53位,变成了10000000000000000000000000000000000000000000000000001|0
因为右边只有52位,而我们的指数位有53位,那么最后一位就变成0了,也就是竖线后面的那一位,所以这也是精度丢失的根本原因.
最终结果:10000000000000000000000000000000000000000000000000010|0
好了,列举了20个,你大概也看出规律了,也看明白了,就不多列了.
恒1
恒1法总得来说就是在舍去的尾部总是置位1,计算方法比较简单,可以自行上网搜索.