面试中经常问道0.1+0.2 != 0.3的原因
小数的二进制表示
相信很多人都能轻而易举的算出一个正整数的二进制表示,但是都没有考虑过小数怎么表示。JS中数值使用的为64位表示,这其中1位表示的是符号位(正数还是负数),52位表示小数,还有剩余的11位表示整数。
对于整数大家应该都知道是对2取余,去求一个数的二进制,比如 9 这个正整数
余数
9/2 --> 1
4/2--> 0
2/2 --> 0
1
从下往上一次得出 9的二进制为 1001
整数的正负 由最高位决定 最高位为0 为正数,最高位是1,为负数 。
那么对于小数呢 ,正好和整数相反,整数是对2取余,而小数是对2求积。比如0.1这个小数
小于1 为0, 大于1 为 1 ,对其结果 -1后继续 *2 ,直到等于1为止
0.1*2 --> 0
0.2*2 --> 0
0.4*2 --> 0
0.8*2 --> 1 (1.6-1)
0.6*2 --> 1 (1.2-1)
0.2*2 --> 0
0.4*2 --> 0
0.8*2--> 1
........
由此我们得知了0.1是一个循环的 0.0001100110011001100110011001100110011001100110011001101
同理我们可以根据以上方法求得 0.2的二进制表示
0.001100110011001100110011001100110011001100110011001101
根据二进制求和得出结果为 0.0100110011001100110011001100110011001100110011001101
转为十进制 则等于0.30000000000000004 != 0.3 所以当前的等式不成立。
到这儿我觉着你应该搞清了吧