🔢Number.MAX_SAFE_INTEGER

🚧 under construction

JSvalueprimitivenumberspecial ⟩ Number.MAX_SAFE_INTEGER

JS 可以表示的數字 (representable numbers) 與數字之間的間隔會根據不同的區間而有所區別:在 2⁰ ~ 2¹ 之間,數字的間隔是 2¯⁵²、在 2¹ ~ 2² 之間,數字的間隔是 2¯⁵¹,以此類推,每增加一個數量級,數字之間的間隔就會乘以 2 倍,到了 2⁵² ~ 2⁵³ 之間,數字的間隔是 2⁰ = 1,換句話說,到了這個區間以上,只剩下整數可以表示

到了 2⁵³ ~ 2⁵⁴ 之間,數字的間隔是 2¹ = 2,換句話說,連整數都開始無法完整表示,開始有「漏洞」,這就是為什麼 Number.MAX_SAFE_INTEGER = 2⁵³ - 1 = 9007199254740991 的道理了。

    ┌─────────────────────────┐
    │ Number.MAX_SAFE_INTEGER │
    └─────────────────────────┘

       2⁵¹                                                2⁰
   2⁵²↴↓                                                  ↓
    = 11111111111111111111111111111111111111111111111111111
       ╰──────────────────── 52-bit ──────────────────────╯
    = 2⁵³ - 1
    = 9007199254740991

怪異的進位行為

const N = Number.MAX_SAFE_INTEGER;        // 2⁵³ - 1

// 雖然我們知道 2⁵³ ~ 2⁵⁴ 之間,數字的間隔是 2¹ = 2,也就是都是「偶數」
// 但偶數的「跳法」卻頗為怪異:
N,      // 9007199254740991
N + 1,  // 9007199254740992
N + 2,  // 9007199254740992
N + 3,  // 9007199254740994
N + 4,  // 9007199254740996
N + 5,  // 9007199254740996
N + 6,  // 9007199254740996
N + 7,  // 9007199254740998
N + 8,  // 9007199254741000

雖然並不了解 IEEE 754 背後運作的原理,但下面我們試著「猜測」它是怎麼運作的:

let N = Number.MAX_SAFE_INTEGER = 9007199254740991

	N + 1 = 9007199254740992

	 ╭─────────────────── ☆ 52-digit ───────────────────╮
	11111111111111111111111111111111111111111111111111111
     +                                                      1
  ────────────────────────────────────────────────────────────
       100000000000000000000000000000000000000000000000000000
	╰─────────────────── ☆ 52-digit ───────────────────╯


	 N + 2 = 9007199254740992                           2¹

	  ╭─────────────────── ☆ 52-digit ───────────────────╮
	 11111111111111111111111111111111111111111111111111111
     +                                                      10
   ────────────────────────────────────────────────────────────
        100000000000000000000000000000000000000000000000000001 (01 捨棄 1?)
	 ╰─────────────────── ☆ 52-digit ───────────────────╯
	 

	 N + 3 = 9007199254740994                           2¹

	  ╭─────────────────── ☆ 52-digit ───────────────────╮
	 11111111111111111111111111111111111111111111111111111
     +                                                      11
    ────────────────────────────────────────────────────────────
        100000000000000000000000000000000000000000000000000010
	 ╰─────────────────── ☆ 52-digit ───────────────────╯
	 

	 N + 4 = 9007199254740996                           2¹

	  ╭─────────────────── ☆ 52-digit ───────────────────╮
	 11111111111111111111111111111111111111111111111111111
     +                                                     100
   ────────────────────────────────────────────────────────────
        100000000000000000000000000000000000000000000000000011 (11 進位?)
      = 10000000000000000000000000000000000000000000000000010
	 ╰─────────────────── ☆ 52-digit ───────────────────╯
	 

	 N + 5 = 9007199254740996                           2¹

	  ╭─────────────────── ☆ 52-digit ───────────────────╮
	 11111111111111111111111111111111111111111111111111111
      +                                                    101
   ────────────────────────────────────────────────────────────
        100000000000000000000000000000000000000000000000000100
	 ╰─────────────────── ☆ 52-digit ───────────────────╯
	 

	 N + 6 = 9007199254740996                           2¹

	  ╭─────────────────── ☆ 52-digit ───────────────────╮
	 11111111111111111111111111111111111111111111111111111
      +                                                    110
   ────────────────────────────────────────────────────────────
        100000000000000000000000000000000000000000000000000101 (01 捨棄 1?)
	 ╰─────────────────── ☆ 52-digit ───────────────────╯
	 

	 N + 7 = 9007199254740998                           2¹

	  ╭─────────────────── ☆ 52-digit ───────────────────╮
	 11111111111111111111111111111111111111111111111111111
      +                                                    111
   ────────────────────────────────────────────────────────────
        100000000000000000000000000000000000000000000000000110
	 ╰─────────────────── ☆ 52-digit ───────────────────╯
	 

	 N + 8 = 9007199254741000                           2¹

	  ╭─────────────────── ☆ 52-digit ───────────────────╮
	 11111111111111111111111111111111111111111111111111111
      +                                                   1000
   ────────────────────────────────────────────────────────────
        100000000000000000000000000000000000000000000000000111 (11 進位?)
      = 10000000000000000000000000000000000000000000000000100
	 ╰─────────────────── ☆ 52-digit ───────────────────╯

Last updated