큰 정수 정확한 계산기|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제곱을 넘는 거대한 정수 계산 예시가 자동으로 입력되어, 일반 계산기와의 차이를 바로 확인할 수 있습니다.
자주 묻는 질문
여담이지만 ― 컴퓨터는 "큰 숫자"를 다루는 데 서툴렀다
컴퓨터의 숫자 표현에는 오랫동안 제약이 있었습니다. 대부분의 프로그래밍 언어가 기본으로 사용하는 64비트 부동소수점(배정밀도)은 안전하게 다룰 수 있는 정수 범위가 2의 53제곱−1(9,007,199,254,740,991)까지로 정해져 있습니다. 이는 가수부가 53비트밖에 되지 않기 때문이며, 이를 넘는 정수는 표현할 때 반올림 오차가 발생합니다. 우리 사이트의 "계산기" 도구 역시 예외가 아니며 이와 동일한 정밀도 한계를 가지고 있습니다.
이 문제를 해결하는 것이 임의 정밀도 정수(흔히 bignum이라 불림)라는 개념입니다. JavaScript에서는 2020년 무렵부터 BigInt라는 새로운 형식이 모든 주요 브라우저에 표준으로 탑재되어, 메모리가 허용하는 한 자릿수 제한 없이 정수를 정확하게 다룰 수 있게 되었습니다. 다만 내부적으로는 많은 자릿수를 배열 형태로 관리하기 때문에, 자릿수가 늘어날수록 계산에 시간이 걸리는 트레이드오프가 있습니다.
암호 분야에서도 이 기술은 필수적입니다. 예를 들어 RSA 암호의 키는 2048비트(10진수로 600자리 이상)의 정수가 사용되는 경우도 드물지 않으며, 이러한 거대한 수의 곱셈・거듭제곱 나머지 연산을 정확히 수행하기 위해 임의 정밀도 정수 라이브러리가 전 세계 암호 소프트웨어에서 사용되고 있습니다.
경쟁 프로그래밍의 세계에서도 큰 계승(예: 100의 계승은 158자리)이나 피보나치 수열의 먼 항을 구하는 문제가 자주 출제됩니다. 일반 숫자 형식으로는 도중에 오차가 섞이기 때문에, 임의 정밀도 정수를 능숙하게 다룰 수 있는지가 정답률을 좌우하는 경우도 적지 않습니다.