체인의정석

Bignumber.js 사용하여 데이터 처리하기 본문

개발/backend

Bignumber.js 사용하여 데이터 처리하기

체인의정석 2023. 8. 25. 18:36
728x90
반응형

예전에 컨트렉트 테스트를 할 때는 web3나 ethers의 단위 변환 특히 parseUnits(amount,decimal) 을 많이 썼었는데

사실 백엔드에서 소수점 계산등을 하려고 하면 잘 안된다. 따라서 예전부터 많이 쓰이는 bignumber.js를 사용해서 계산하는 것이 좋다. 물론 web3나 ethers의 최신 버전에서는 bignumber 없이도 bigint 형태로 모두 처리가 되지만 기존 코드들을 모두 업데이트 하는 것은 쉬운 일이 아니므로 bignumber.js를 사용할 경우가 더 많다.

일단 먼저 계산하기에 앞서서 10진수 숫자형으로 바꾸는 작업부터 해주고

                const price0 = parseInt(data.price0, 10);
                const price1 = parseInt(data.price1, 10);

이를 bignumber 형태로 바꾸어 준다.

                const price0Big = new BigNumber(price0);
                const price1Big = new BigNumber(price1);

그 다음 다음과 같이 bignumber끼리의 연산을 해준다.

volumePerTick = amount0Big.times(price0Big)
    .dividedBy(tickCountBig.dividedBy(tickSpaceBig))
    .dividedBy(new BigNumber(10).pow(decimal0Big));

times는 곱하기, dividedBy는 나누기, pow는 제곱을 해주는 기능을 하며 다음과 같이 연산 순서에 맞게 잘 조합을 해주면 된다.

덧셈의 경우는 다음과 같이 plus를 사용하면 된다.

oldVolBig.plus(newVolBig).toString();

이렇게 하면 소수점이나 큰 단위의 숫자도 문제없이 연산에 성공할 수 있다.

계산을 다 하고 난 후 하나 주의할 점은 bignumber로 모든 연산을 마무리하고 난 후에는 string으로 바꾸어 주어야 한다는 것이다.

안그럼 지수부, 가수부 형태가 아니라 1e16 이런식으로 다른 숫자가 나오게 된다.

                    tickData.volume = volumePerTick.toString();

그래서 이런식으로 넘긴 후에 사용해야 한다.

 

728x90
반응형
Comments