要在 JavaScript 產生超過第 79 項仍保持精確值的費氏數列,請用 BigInt 算術搭配標準零起始遞迴 F(n) = F(n−1) + F(n−2),從 F(0) = 0 與 F(1) = 1 開始。JavaScript 的 Number 原始型別只能精確表示到 2^53 − 1 的整數,這表示 F(79) 已經大於 Number.MAX_SAFE_INTEGER,任何用 Number 做遞迴的程式路徑,從該索引起就會產出四捨五入的值、科學記號,或靜默精度損失。乾淨的處理方式是把種子對(current, next)改成 BigInt 字面值——寫成 0n 與 1n——然後跑單一加法迴圈,把每個結果格式化成十進位字串,而不是強制轉回一般 Number。Fibonacci Sequence Generator 在瀏覽器裡對 1 到 1,000 項套用恰好同一套演算法,因此你可以複製一份帶索引的精確清單,不必自己寫片段,也不必把任何東西上傳到伺服器。

generate fibonacci sequence in javascript
在 javascript 產生費氏數列

純 JavaScript 在 F(79) 的精度牆

JavaScript 的 Number 型別遵循 IEEE-754 雙精度浮點。它只在以零為中心的固定視窗內精確儲存整數:從 -(2^53 − 1) 到 (2^53 − 1) 的每個整數都能無損表示,窗外的值不行。常數 Number.MAX_SAFE_INTEGER 揭露上限(9,007,199,254,740,991),而費氏成長夠快,數列很早就跨過那條線。F(78) 正好在天花板底下;F(79) 是 14,472,334,024,676,221,已經在外面。

對任何 JavaScript 費氏片段的實務後果是:你 log 出來的值,不一定是遞迴產出的值。一旦累計總和越過安全整數邊界,加法會四捨五入到最近可表示的 double,比較檢查仍會以令人意外的方式通過,印出的輸出每一步都更偏離真正的十進位。常見症狀包括連續重複值、像 1.446e+17 這樣的科學記號,以及印出的末項對不上計算機或數學參考。同一段對前 30 項「能用」的程式碼,會靜默破壞後面 70 項,讓隨眼檢查抓不到這個 bug。

BigInt 遞迴如何讓費氏每一位數字都精確

JavaScript 在 ES2020 加入 BigInt 原始型別,正是為了拿掉整數工作的那道天花板。BigInt 值是任意長度的有號整數,沒有浮點四捨五入;你在字面值後面加 n(0n、1n),或對字串呼叫 BigInt() 來建立。兩個 BigInt 相加仍是 BigInt,無論位數多少結果都精確。這正是費氏遞迴需要的性質,因為每一項只是前兩項的和——沒有乘法、沒有除法、沒有平方根、沒有浮點中間值。

直截了當的實作是帶兩個執行中值的單一迴圈:

let current = 0n; let next = 1n; for (let i = 0; i <= 100; i++) { console.log(`F(${i}) = ${current}`); const sum = current + next; current = next; next = sum; }

跑那段片段會印出 F(100) = 354224848179261915075 作為精確十進位字串,沒有指數、沒有四捨五入,因為 current 全程都是 BigInt。經驗法則是讓種子、執行中的那對,以及每一個和都留在 BigInt 裡,絕不要在同一運算式混用 BigInt 與 Number——你若試了,JavaScript 引擎會丟 TypeError。若下游檢查需要一般 Number,只在你知道結果仍落在安全整數範圍時,才在最後用 Number(value) 轉換;否則一路用 BigInt 到顯示,讓模板字面值處理格式化。

用本機方式在 JavaScript 產生費氏數列

若你寧可跳過寫迴圈與除錯,Fibonacci Sequence Generator 會在瀏覽器分頁內跑同一套 BigInt 遞迴,並交回精確十進位文字。一切留在裝置上,因此沒有項數、也沒有產生的值會離開你的機器。步驟很短,適用任何支援的用途——快速示範、程式碼夾具、課堂例子,或把短清單貼進筆記。

  1. 在輸入框輸入 1 到 1,000 的整數項數。此計數解讀為列數,不是目標索引,而且一律從 F(0) 開始。值為 1 只回傳 F(0);值為 20 回傳 F(0) 到 F(19)。
  2. 按下產生動作,讓工具建立清單。摘要面板會顯示產生的項數與最終索引,因此你能一眼確認打進去的計數產出了你預期的索引。
  3. 抽查結果:讀前幾行帶索引的列(F(0) = 0、F(1) = 1、F(2) = 1、F(3) = 2、F(4) = 3),以及接近這次執行末尾的至少一個大值。每一列都應保留零起始索引,每一個值都應是普通十進位整數,沒有科學記號、也沒有千分位分隔符。
  4. 用內建複製按鈕複製結果。剪貼簿酬載就是畫面上顯示的同一段以換行分隔的文字,每項一行 F(index) = value,沒有多加也沒有拿掉任何東西。
  5. 若瀏覽器擋住剪貼簿存取,工具會回報這項限制,並讓產生的文字保持可見。用游標手動選取輸出、從選取範圍複製,你仍會得到精確的帶索引清單。

編輯項數會清除先前結果,因此舊數列不能在尚未處理的新輸入底下留在畫面上。元件也會拒絕它無法剖析的計數:小數、科學記號、正負號、分隔符、零、負值、空白輸入,以及超過 1,000 的計數會被擋下,而不是靜默四捨五入或封頂。驗證、加法、格式化與複製都在瀏覽器執行,因此你打的計數與它產出的數列絕不會離開你的機器。

JavaScript 費氏數列的 Number 對上 BigInt

整數型別的選擇,是任何 JavaScript 費氏實作裡最大的單一決定,取捨也很明確。

做法 精確整數範圍 第一個不精確的費氏項 備註
Number(IEEE-754 double) -(2^53 − 1) 到 (2^53 − 1);天花板以 Number.MAX_SAFE_INTEGER = 9,007,199,254,740,991 揭露 F(79) 起(F(79) = 14,472,334,024,676,221) 越過安全邊界後靜默四捨五入;印出的輸出可能顯示科學記號
BigInt(ES2020) 在記憶體與產品上限內無限制 不能在同一算術運算式與 Number 混用;用模板字面值轉換以供顯示

這張表讓斷點具體化:若你的片段需要 F(80) 或更後面的任何一項,Number 就是錯的原始型別。BigInt 是唯一能保留遞迴每一位數字的內建 JavaScript 型別,這也是 Fibonacci Sequence Generator 對全部 1,000 個支援列使用它的原因。涉及黃金比例的封閉形式刻意不用——浮點次方與平方根會把大費氏值四捨五入,而用 BigInt 遞迴能保留每一位十進位數字。

何時該伸手拿工具,而不是程式碼片段

把 BigInt 迴圈寫一次是有用的練習,當數列是更大程式的一部分、需要重算、參數化或嵌進業務邏輯時,確實值得。對一次性需求——抓一份固定帶索引清單做單元測試、用相同值比較兩種語言、把教學例子複製進投影片——貼上完成的清單更快,也拿掉迴圈邊界差一的風險。工具也繞開前幾項周圍的細微歧義:有些印出的數列從 1, 1, 2, 3, 5 ... 開始,有些從 0, 1, 1, 2, 3, 5 ... 開始。產生器使用 OEIS 費氏條目(A000045) 與 NIST Digital Library of Mathematical Functions 所記載的零起始定義,因此每一列都錨在與你在 JavaScript 寫的遞迴相符的明確索引。

1,000 項的天花板是產品效能邊界,不是數學邊界。F(999) 已經含有數百位十進位數字,完整輸出大到需要捲動,因此把計數封頂能讓渲染的 DOM 與剪貼簿酬載維持合理大小。若你需要數百萬項,或想對數列做數論工作——質數性、因數密度、模模式——那是帶大量儲存格式的程式環境任務,不是瀏覽器元件任務。對 1 到 1,000 範圍內的一切,產生器給你的精確十進位文字,形式與手寫 BigInt 迴圈會產出的相同,隨時可貼到你需要的地方。

若要更深入了解,見 在 JavaScript 產生隨機日期而不發生 DST 漂移.

若要更深入了解,見 如何精確計算費氏數列.