Java Script에서 큰 숫자를 사용할 때 BigInt를 사용하는데요.
왜 BigInt를 사용해서 계산하면 생각과는 다른 결과가 나오는 걸까요?!!
어떤 경우에 계산 결과가 다른건지!
그리고 해결 방법은 무엇인지 알아봅시다!
BigInt 정의(MDN 공식 문서)
**BigInt**는 Number 원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1보다 큰 정수를 표현할 수 있는 내장 객체입니다.
BigInt는 정수 리터럴의 뒤에 n을 붙이거나(10n) 함수 BigInt()를 호출해 생성할 수 있습니다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/BigInt
MDN 공식 문서에 표기되어 있는 것 처럼, BigInt가 나타낼 수 있는 최대치는 다음과 같습니다!
그리고 그 최대치 값을 MAX_SAFE_INTEGER라고 합니다!
아래처럼 브라우저 콘솔창에 입력하고 출력된 결과를 확인해보세요!
그러면 오른쪽의 등호가 성립된다는걸 아시겠죠? => 2**53 -1 == 9007199254740991 == Number.MAX_SAFE_INTEGER
예시를 보겠습니다!
먼저 브라우저 콘솔창에 아래 코드를 입력해보세요!
'123123 ~~~~ 4' 가 나올 것 같다고 예상하시겠죠? 그러나 생각과는 전혀 다른 계산 결과가 나올겁니다!
BigInt(12312312312312312312) + BigInt(2) // 12312312312312311810n
1. 왜 계산 결과가 다른 것인가!
이유가 뭘까요?
이유는 계산하려는 숫자 자체(즉, BigInt 안의 숫자)가 MAX_SAFE_INTEGER를 넘어가면 제대로 표현하지 못한다고 해요!
BigInt 안의 숫자(12312312312312312312)는 MAX_SAFE_INTEGER(=2^53 - 1)를 넘어가므로 계산 결과가 제대로 표현되지 못한 것이죠!
* 아래 콘솔 결과처럼 MAX_SAFE_INTEGER 범위 안의 숫자들로 계산한 결과는 계산 결과가 제대로 표현된 것을 볼 수 있죠
2. 해결 방법은?
MAX_SAFE_INTEGER의 범위를 넘어가는 값을 사용하기 위해서는 BigInt 안에 숫자를 문자열로 표기해줘야 한다!
(BigInt를 사용하는 이유인거죠!)
BigInt 안의 숫자에 따옴표('')를 붙여서 문자열로 표현을 했더니 예상했던 '123123 ~~~~ 4' 가 나오는걸 확인할 수 있죠!
* 참고로, MAX_SAFE_INTEGER BigInt끼리 연산(+, * 등)을 수행한 결과값은 MAX_SAFE_INTEGER 이상으로 넘어가도 제대로 표현됩니다!
아래 코드들로 실습해보면서 BigInt 를 익혀봅시다~~
console.log(Number.MAX_SAFE_INTEGER) // 2^53 - 1
BigInt(12312312312312312312) + BigInt(2) // 제대로 작동하지 않음
BigInt(Number.MAX_SAFE_INTEGER)
BigInt(Number.MAX_SAFE_INTEGER) + 1000n // 제대로 작동
BigInt(5) + 5n
BigInt(5) + 5 // error
BigInt(5) / 2n // 2n (소수 표현 안됨)
BigInt("10") + BigInt("10") // 큰 값을 정수로 입력받을 때에는 string으로 처리해서 받아야 함
마무리!!
참고로, 2022년 기준으로 BigInt 객체가 추가된지는 2년밖에 되지 않았다고 합니다!
그렇기 때문에 2년 전 책이나 블로그를 보시면 언급되어 있지 않아 구글링하실 때 참고하시길 바랍니다!
BigInt가 자주 사용되지 않지만 저처럼 고민하는 분들에게 도움이 되었음 좋겠습니다!!
오늘도 훈훈한 멋사로 마우으리,,사랑해여 동기 여러분,,💛
'Java Script' 카테고리의 다른 글
axios withCredentials 옵션으로 쿠키 보내기(로그인 인증 유지 안될때) (3) | 2023.12.21 |
---|---|
JS에서의 this (0) | 2023.04.10 |
자바스크립트-String(slice, substring, substr, replace, replaceAll, includes, split, trim) (1) | 2022.09.30 |