大整數精確計算器|基於BigInt的無位數限制加減乘除與乘方

免費工具,可對位數極多的巨大整數進行零誤差的精確計算。基於JavaScript的BigInt實現,即使超過9,007,199,254,740,991(2的53次方減1)也能準確完成加法、減法、乘法、整數除法(商和餘數)與乘方運算。

為什麼超過2的53次方會產生誤差

普通計算器和JavaScript的數值型別(Number)一旦超過2的53次方(Number.MAX_SAFE_INTEGER),就無法區分相鄰的整數。使用BigInt可以突破這一限制進行精確計算。

Number.MAX_SAFE_INTEGER 9,007,199,254,740,991(253 − 1)
9007199254740992 + 1 Number: 9007199254740992(誤り) / BigInt: 9007199254740993(正確)

使用技巧

  • 普通計算器和電子表格軟體的數值型別一旦超過2的53次方(約900萬億)就會產生誤差,而本工具使用BigInt,可以在不限位數的情況下精確計算。
  • 整數除法(÷)會同時顯示商和餘數,方便驗證加密和雜湊計算中常用的取模運算。
  • 為了安全起見,乘方的指數上限設為100萬,因為指數過大可能導致瀏覽器無響應。
  • 輸入框中即使包含千位分隔符(例如1,234,567)也會在計算前自動去除,因此可以直接貼上帶分隔符的數值。
  • 點選"插入示例"按鈕,會自動填入一個超過2的53次方的巨大整數計算示例,可以立即體會與普通計算器的差異。

常見問題

JavaScript的普通數值型別(Number)是IEEE 754雙精度浮點數,能夠安全表示的整數上限是2的53次方減1(9,007,199,254,740,991)。超過這個範圍後,相鄰的整數將無法區分,計算結果就會產生誤差。本工具通過使用BigInt型別完全避開了這一上限。

不可以。BigInt作為JavaScript標準規範只支援整數,無法表示小數。如需進行包含小數的一般計算,請使用本站的"計算器"工具。

餘數的計算方式為 A − (商 × B),其中商是向零方向截斷得到的。例如 −7 ÷ 2 的商為 −3,餘數為 −1。

適用於普通計算器精度不足的場景,例如驗證RSA金鑰(數百到數千位的整數運算)、計算大階乘、或在競技程式設計中核對任意精度整數運算的結果。

沒有明確的硬性上限,但會受到瀏覽器記憶體和處理速度的實際限制。幾千到幾萬位的數值可以瞬間完成計算,但極端情況(例如乘方指數超過100萬)出於安全考慮會被限制。
ツールくん

閒話 ― 計算機為何不擅長處理"大數字"

計算機的數值表示長期以來存在限制。大多數程式語言預設使用的64位浮點數(雙精度)只能安全表示到2的53次方減1(9,007,199,254,740,991)為止的整數,這是因為其尾數部分只有53位。超過這個範圍,表示這些整數時就會產生舍入誤差。我們網站自己的"計算器"工具也同樣存在這個精度上限。

任意精度整數(俗稱bignum)正是為了解決這個問題而生。大約從2020年起,JavaScript在所有主流瀏覽器中標準搭載了名為BigInt的新型別,只要記憶體允許,就能在不限位數的情況下精確處理整數。不過其內部是以陣列形式管理大量位數的,因此位數越多計算耗時也越長,存在精確度與速度之間的權衡。

這項技術在密碼學領域也不可或缺。例如RSA加密的金鑰常常使用2048位(十進位制超過600位)的整數,全世界的加密軟體都依賴任意精度整數庫來準確完成這類巨大數字的乘法和模冪運算。

在競技程式設計的世界裡,求較大階乘(例如100的階乘有158位)或斐波那契數列較遠項的問題也十分常見。由於普通數值型別在計算過程中會混入誤差,是否熟練掌握大整數處理往往直接影響解題的正確率。