0.1+0.2为什么不等于0.3 万恶计算标准

108 阅读1分钟

二进制计算规律

这种方法叫做“乘2取整法” 转换0.1为二进制:

  1. 第一次操作:0.1×2=0.20.1×2=0.2,整数部分为0,所以第一位是0。
  2. 第二次操作:0.2×2=0.40.2×2=0.4,整数部分为0,所以第二位也是0。
  3. 第三次操作:0.4×2=0.80.4×2=0.8,整数部分为0,第三位也是0。
  4. 第四次操作:0.8×2=1.60.8×2=1.6,整数部分为1,第四位是1,同时留下0.6继续操作。
  5. 第五次操作:0.6×2=1.20.6×2=1.2,整数部分为1,第五位是1,剩下0.2。
  6. 之后:这个过程会继续,0.2乘以2得到0.4,接下来又是0.8,然后1.6,每次都会产生一个循环的模式,即0.0001 1001 1001 1001...

IEEE 754

  1. js采取了其中的64位双精度,由于小数,转二进制有无限循环位,而64位又由这个 1位符号位,11 位指数位,52 位的有效位,无法容纳无限循环的小数。
  2. 怎么解决,通过这个parseFloat(a.toFixed(4)) tofixed是为一个字符串,所以通过parsefloat转为数字。
  3. 其实从这里看出,其js最大整数的范围将是这个,-2^53 --- 2 ^53 ,从这个角度来讲不适合大数运算,引出了Big int 就是对于超出限制的大数,也可以正常存储。