0.1 + 0.2 != 0.3

深入分析0.1 + 0.2 != 0.3

计算机在存储数字是通过二进制来存储的,呈现的时候是通过十进制来呈现的,所以会有误差

为什么计算机的二进制存储会造成误差呢?下面来一步步深究

十进制转二进制的转换规则

整数

  • 转换规则
    • 除二取余,然后倒序排列,高位补零

整数10进制转2进制

可以得出1010001,可以看出有7位,但是计算机内部标识数是定长的,例如8位16位32位,所以7位是不够的,需要高位补0,也就是01010001,规范写法(81)10 = (01010001)

不够位数高位补0

负整数

  • 转换规则
    • 正整数转成二进制
    • 对二进制取反
    • 对取反后的二进制进行加1

-81转为二进制

小数

  • 转换规则
    • 小数点以后得数乘以2,得出结果,取结果的整数部分(不是0就是1),然后再对结果的小数点以后的数乘以2,得出结果,再取结果整数部分,再然后然后再对结果的小数点以后的数乘以2。。。。以此类推。。直到小数部分为0或者位数已经到达位数。再把这个过程中取的整数按先后顺序排好就行了。

0.125转为二进制

121.6转为二进制

0.1 + 0.2

再回到 0.1 + 0.2 这个问题

可以看到,0.1和0.2转为二进制都是无限循环的,超过了最大位数, 所以存储时只能通过近似值取存储他们,那自然的,当0.1 + 0.2 时,近似值转十进制可定也是近似值,所以会有误差。