• js 的 二进制


    1. 整数

    例如十进制的 30

    30/2  .......... 0

    15/2 ............ 1

     7/2 ............ 1

    3/2 .............. 1

    1/2 .............. 1

    所以得到结果是 从下往上,倒着排 11110 就是二进制的 30

    2. 小数

    例如十进制的 0.125

    0.125*2=0.25 ............. 0

    0.25*2=0.5 ............. 0

    0.5*2=1 ............. 1

    所以得到结果是 从上往下,顺着排 0.001 就是二进制的 0.125

    3.为什么 0.1 + 0.2 !== 0.3 ?

    因为 JS 采用了 IEEE 754 双精度版本(64位), 只要采用了 IEEE 754 的语言都会有这个问题。

    从上面我们看到,二进制的小数是怎么算的,而这种结果很可能会导致无限循环。

    例如十进制的 0.1

    0.1*2=0.2 .......... 0

    0.2*2=0.4 .......... 0

    0.4*2=0.8 .......... 0

    0.8*2=1.6 .......... 1

    0.6*2=1.2 .......... 1

    0.2*2=0.4 .......... 0

    。。。

    所以得到结果是 从上往下,顺着排 0.00011(0011不断循环) 就是二进制的 0.1

    因为我们不可能把 0.1 的无限循环都记录下来,所以 0.1 在 JS 引擎里面被截取了前面的部分

    因此 0.1 在 JS 引擎里面不再精确地表示 0.1 了。

    同样 0.2 也有或者这个问题,所以 2 个非精确的小数相加,也就得到一个非精确的小数了。

    ps: 认真数了一下,JS 到小数点后第18位,就完全忽略了。

    JS Number 类型的二进制组成

    根据国际标准 IEEE 754,JavaScript 浮点数的64个二进制位,从最左边开始,是这样组成的。

    • 第1位:符号位,0表示正数,1表示负数
    • 第2位到第12位(共11位):指数部分 (表示 2^−1022~2^1023)
    • 第13位到第64位(共52位):小数部分(有效数字,可以到53位精度)

    疑问1:为什么明明52位,为什么可以表示53位精度?

    IEEE754规定小数部分第一位隐含为1,不写,因为所有二进制第一个有效数字都是1。

    所以加上省略的1位,精度位数是 53 bit。所以在 0 ~ 2^53 内的整数都是有效数字,算上第1位符号位,就可以得到 -2^53 ~ 2^53 都是有效数字

    疑问2:为什么 11 位指数位,负数方向只能表示到 2^-1022 ,不能表示到 2^-1024 呢?

    无论如何浮点数都满足最左边是 1。这就有一个严重问题:0没有办法被表示,因此指数为 -1023 时表示 0。

    还有一种情况就是 Infinity,这种情况当指数是 -1024 时,表示无穷大

  • 相关阅读:
    Silverlight C# 游戏开发:Flyer05与什么什么进行搏斗
    Silverlight C# 游戏开发:Flyer07做一个有开始的游戏
    Silverlight C# 游戏开发:面向对象在游戏中的实例(一)
    Silverlight C# 游戏开发:面向对象在游戏中的实例(二)
    Silverlight C# 游戏开发:Flyer06小小的改进让游戏更有趣
    linux网络命令ip\route\links回顾
    Google Style的C++编码规范
    TCP/IP协议和IP组播的视频传输
    Multicast server and client in Python
    用户profile中umask码的含义详解(默认是022)
  • 原文地址:https://www.cnblogs.com/amiezhang/p/11385797.html
Copyright © 2020-2023  润新知