큰 정수 정확한 계산기|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)로 구해지는 값이며, 몫은 0 방향으로 잘라내는(트런케이션) 방식으로 계산됩니다. 예를 들어 −7 ÷ 2의 몫은 −3, 나머지는 −1이 됩니다.

암호 기술에서 사용되는 RSA 키(수백~수천 자리의 정수 연산)의 검산, 큰 계승 계산, 경쟁 프로그래밍에서의 임의 정밀도 정수 연산 확인 등 일반 계산기로는 정밀도가 부족한 상황에서 활용할 수 있습니다.

명확한 상한은 없지만 브라우저의 메모리와 처리 속도의 제약을 받습니다. 수천~수만 자리 정도라면 즉시 계산할 수 있지만, 극단적으로 큰 자릿수(거듭제곱의 지수가 100만을 넘는 경우 등)는 안전을 위해 제한하고 있습니다.
ツールくん

여담이지만 ― 컴퓨터는 "큰 숫자"를 다루는 데 서툴렀다

컴퓨터의 숫자 표현에는 오랫동안 제약이 있었습니다. 대부분의 프로그래밍 언어가 기본으로 사용하는 64비트 부동소수점(배정밀도)은 안전하게 다룰 수 있는 정수 범위가 2의 53제곱−1(9,007,199,254,740,991)까지로 정해져 있습니다. 이는 가수부가 53비트밖에 되지 않기 때문이며, 이를 넘는 정수는 표현할 때 반올림 오차가 발생합니다. 우리 사이트의 "계산기" 도구 역시 예외가 아니며 이와 동일한 정밀도 한계를 가지고 있습니다.

이 문제를 해결하는 것이 임의 정밀도 정수(흔히 bignum이라 불림)라는 개념입니다. JavaScript에서는 2020년 무렵부터 BigInt라는 새로운 형식이 모든 주요 브라우저에 표준으로 탑재되어, 메모리가 허용하는 한 자릿수 제한 없이 정수를 정확하게 다룰 수 있게 되었습니다. 다만 내부적으로는 많은 자릿수를 배열 형태로 관리하기 때문에, 자릿수가 늘어날수록 계산에 시간이 걸리는 트레이드오프가 있습니다.

암호 분야에서도 이 기술은 필수적입니다. 예를 들어 RSA 암호의 키는 2048비트(10진수로 600자리 이상)의 정수가 사용되는 경우도 드물지 않으며, 이러한 거대한 수의 곱셈・거듭제곱 나머지 연산을 정확히 수행하기 위해 임의 정밀도 정수 라이브러리가 전 세계 암호 소프트웨어에서 사용되고 있습니다.

경쟁 프로그래밍의 세계에서도 큰 계승(예: 100의 계승은 158자리)이나 피보나치 수열의 먼 항을 구하는 문제가 자주 출제됩니다. 일반 숫자 형식으로는 도중에 오차가 섞이기 때문에, 임의 정밀도 정수를 능숙하게 다룰 수 있는지가 정답률을 좌우하는 경우도 적지 않습니다.

→ 모든 여담 보기