728x90

JavaScript에서 숫자는 내장 데이터 유형으로 Number를 사용한다. 그러나 Number는 64비트 부동 소수점 수로 구현되어 있으며, 이는 매우 큰 또는 매우 작은 숫자를 처리하는 데 제한이 있다. 매우 큰 또는 매우 작은 숫자를 '정확'하게 다룰 필요가 있는 경우, BigNumber와 같은 라이브러리를 사용하는 것이 좋다.

 

어떤 이유로 제한이 있을까?

JavaScript에서 숫자는 64비트 부동 소수점 수로 구현되어 있다. 이는 64비트로 이루어진 이진수로 부호 비트, 지수 비트, 가수 비트로 구성되어 있다. 이진수로 숫자를 표현하므로, 숫자는 2진수로 저장되고, 이진수 연산으로 처리된다.

이진수는 0과 1로만 이루어져 있으므로, 숫자를 표현하는 데 있어서 제한이 있다. 가수 비트에 저장할 수 있는 비트 수가 제한되어 있으므로, 큰 숫자를 다루는 데 제한이 있다. 예를 들어, JavaScript의 Number는 최대 9007199254740991 (2의 53승 - 1)까지만 정확하게 표현할 수 있다. 이보다 큰 숫자는 근사치로 처리되므로, 정확한 계산이 불가능해진다.

또한, JavaScript의 Number는 소수점 아래 자리수를 다루는 데에도 제한이 있다. 이는 부동 소수점의 특성으로 인한 것으로, 실수를 이진수로 변환하는 과정에서 소수점 아래 자리수를 정확하게 표현할 수 없는 경우가 있다. 이로 인해, 매우 작은 숫자 또는 매우 큰 숫자를 다룰 때, 오차가 발생할 수 있다.

이러한 이유로, JavaScript의 Number는 매우 큰 숫자나 매우 작은 숫자를 다루는 데에 제한이 있다. 이를 극복하기 위해, BigNumber와 같은 라이브러리를 사용하여 매우 큰 숫자나 매우 작은 숫자를 정확하게 다룰 수 있다.

번외로 BigNumber는 수학적인 계산에 대한 정확도와 정밀도를 제어할 수 있는 다양한 옵션을 제공한다.

 

 

간단한 예시를 보자.

 

console.log(0.1 + 0.2); // 0.30000000000000004


위 코드를 실행하면, 0.1과 0.2를 더한 값이 0.3이 아닌 0.30000000000000004가 출력됩니다. 이는 JavaScript의 Number가 부동 소수점 수로 구현되어 있어서, 실수를 이진수로 변환하는 과정에서 소수점 아래 자리수를 정확하게 표현할 수 없는 경우가 발생하기 때문이다.

큰 숫자를 다룰 때의 오차가 발생하는 예시를 보자.

console.log(12345678901234567890); // 12345678901234567000


위 코드를 실행하면, 12345678901234567890이 아닌 12345678901234567000이 출력된다. 이는 JavaScript의 Number가 가수 비트에 저장할 수 있는 비트 수가 제한되어 있어서, 큰 숫자를 다룰 때 근사치로 처리되기 때문이다.

그렇다면 BigNumber를 활용하여 위의 문제를 보완한 예시를 보자.

const num1 = new BigNumber(0.1);
const num2 = new BigNumber(0.2);
const result = num1.plus(num2);

console.log(result.toString()); // "0.3"


위 코드에서, BigNumber 클래스를 사용하여 0.1과 0.2를 BigNumber 객체로 생성한 후, plus() 메소드를 사용하여 더한 결과를 BigNumber 객체로 반환한다.

 

이번엔 큰 숫자를 다루는 예시 코드를 보자.

const num = new BigNumber('1234567890123456789012345678901234567890');
console.log(num.toString()); // "1234567890123456789012345678901234567890"


위 코드에서, new 연산자를 사용하여 BigNumber 객체를 생성할 때, 문자열 형태로 매우 큰 숫자를 전달한다. 이후, toString() 메소드를 사용하여 결과값을 문자열로 변환하여 출력한다.

 

이렇게 BigNumber를 사용하면, 더 높은 정확도와 정밀도를 보장할 수 있다.

 

https://mikemcl.github.io/bignumber.js/

 

bignumber.js API

bignumber.js A JavaScript library for arbitrary-precision arithmetic. Hosted on GitHub. The library is incorporated into this page, so it should be available in the console now. API See the README on GitHub for a quick-start introduction. In all examples b

mikemcl.github.io

 

728x90
복사했습니다!