JS Number 储存和计算

Number 存储和计JS 所能表达的最大最小值计算方法

notion image
notion image
notion image

JS 中最大的数计算方法

  • 指数位应该是 11 位 1, 存储指数为 2 ^ 11 - 1 = 2047, 其中最后一位代表 Infinity, 所以实际指数为 2047 - 1023 - 1 = 1023
    • 当指数位不为最小的情况下, 精度位前面是 1
      • 精度位应该是 52 位 1, 最小精度为 2 ^ 52
        • 所以最大数的计算应为, 2 ^ 1024 - 2 ^ 52, 因为 2 ^ 1024 已经是 Infinity 了, 所以我们需要换种计算方法, 即为 2 ^1023 - 2 ^ 52 + 2 ^ 1023
          // JS最大数 Math.pow(2, 1023) - Math.pow(2, 1023 - 52) + Math.pow(2, 1023); > 1.7976931348623157e308 // JS最小数改变符号即可 > -1.7976931348623157e308

          JS 中最小正小数计算方法

          • 指数位应该是 11 位 0, 存储指数为 0, 实际指数位为 0 - 1023 = -1023
            • 当指数位最小的情况下, 精度位前面是 0
              • 精度位应该是 51 位 01 位 1, 最小精度为 2 ^ 52
                • 所以最小正小数数的计算应为, 2 ^ (-52 - 1022)
                  // JS最小正小数 Math.pow(2, -52 - 1022); > 5e-324 // JS最大负小数改变符号即可 > -5e-324

                  JS 中的精确(安全)数字

                  这里我们只讨论精确整型, 而不讨论精确浮点数

                  最大精确(安全)整型

                  最大的精确的整形数字应该的指数位应该是0, 然后精度位应该是 52 位 1, 加上最前面的一位 1, 所以应为 2 ^ 53 - 1
                  // JS最小安全整型为 +0 和 -0 > +0 > -0 // JS最大安全整型 Math.pow(2, 53) - 1; > 9007199254740991

                  为什么不讨论精确(安全)浮点数

                  只要是数字的有效位超过 52 位, 都不是精确数字, 在二进制转换或计算中都有可能丢失精度. (所以所有二进制循环小数都不是精确数字)

                  Reference


                  © Jiyu Shao 2018 - 2025