#38 BigInteger

국기웅·2024년 6월 17일

클리커 게임을 플레이하다보면 숫자의 단위가 말도아니게 커진다.
이런 숫자들을 float,int, uint등으로 저장하기보다는 BigInteger로 저장하는 것이 좋아보인다.
이번 과제 중에 숫자 단위별로 축약시켜 표현하는(434k, 124m등) 과제가 있어 알아보았다.

BigInteger

.Net 프레임워크 4.0부터 지원을 시작한 구조체이다.
기본적으로 BigInteger내부에 정의된 함수로 여러 연산 또한 가능하다.

본래 int,float등으로 큰수의 계산을 하는 경우, OverflowException이 나타난다. 이는 변수가 저장할 수 있는 공간을 넘어서 저장하려해서 일어나는 오류이다.
하지만 BigInteger는 이런 공간이 매우 넓은 것이라고 보면 될 것 같다. 무한은 아니다.

BigInteger내부에는 Devide, Log, Multiply, Pow 등 기본적인 수학 계산을 지원한다. 자세한 내용은 이쪽에서 확인

내가 코딩을 할때 처음엔 float, int로 프로그래밍하여, 이 부분을 수정하는데 조금 애먹었다. BigInteger를 float 혹은 int로 형변환을 해줘야 하다보니...
그리고 소수는 표현해주지 않는다.. 이부분은 나눗셈을 할때 고려해야한다.

자리를 나눠 표현하기

    private string[] BigIntegerUnitArr = new string[] {"","K","M","B","Qa","Qi","Sx","Sp","O","N","D","Ud","Dd","Td","Qad","Qid","Sxd"};
    private string GetBigIntegerText(BigInteger value)//단위로 끊어서 보여주는 함수
    {
        int placeN = 3;
        List<int> numList = new List<int>();
        int p = (int)Mathf.Pow(10, placeN);

        do
        {
            numList.Add((int)(value % p));
            value /= p;
        }
        while (value >= 1);
        string returnStr = "";
        for(int i = 0;i < numList.Count; i++)
        {
            returnStr = numList[i] + BigIntegerUnitArr[i];//반복문을 돌릴 필요는 없음, 유닛배열을 넘어가면 오류발생,
            //위 코드 마지막에 + returnStr을 하여 123M456K789 처럼 표시 가능
        }
        return returnStr;
    }

위 코드를 통해 자리를 나눠 표현하였다.
단위를 나타내는 문자를 사용한 배열을 우선 만들어준다.
메서드 내부를 보면 Mathf.Pow를 사용하였다. 이건 제곱계산의 함수이다.
이를 통해 자릿수를 지정해주고, 이 자릿수만큼 BigInteger를 나눠주었다.
이때 나온 나머지들을 배열로 나눠서 저장한다고 보면 된다.
이제 나온 배열과, 단위의 배열을 서로 조합해주면 끝난다.

나는 가장 높은 숫자단위만 필요하여 그부분만 확인하였다.

좌측 상단에 잘 표현되는 것을 볼 수 있다.

profile
게임개발호소인

0개의 댓글