스파르타 게임개발종합반(Unity)/TIL - 본캠프 매일 공부 기록

2024.04.25 TIL - double형 소수점 자리수, ToString, int, 명시적 형변환

테크러너 2024. 4. 25.

double형 변수의 소수점 자리수 문제

43  // Math.Round()로 첫째 자리수까지 반올림 한 결과
체력 86.1 -> 43.099999999999994

double형을 쓰다보면 나누거나 곱할 때 소수점 자리수가 길어져서 귀찮은 일이 발생한다.

그래서 `Math.Round(변수명, 1)`를 사용하여 첫째 자리수까지 반올림 한 결과를 `체력 감소 메소드`의 매개변수로 넘겨줬는데...

보다시피 `43.099999999999994`로 저장됐다.. 분명 43을 넘겨줬는데?? (86.1 - 43 = 43.1)

 

문제는 `부동 소수점`의 정확도와 관련이 있다.

컴퓨터실수를 이진법으로 표현하므로, 10진수로 표현되는 숫자 중 일부는 정확히 표현할 수 없다.

이로 인해 부동 소수점 연산에서 정확한 결과를 기대하기 어려울 수 있다.

 

게다가 `Math.Round()`를 썼으면 43.0으로 나와야지 43으로 나온다. 허참..

 

 

ToString(N1) 사용? 그보다는 근본적인 해결책 제시

그래서 `health.ToString(N1)` 이런식으로 출력시 소수점 자리수를 맞춰주는 방법을 사용해봤다.

그런데 출력하는 곳이 한 군데도 아니고 너무 많다~~

결국 근본적인 해결을 해야한다.

            // 보상 없고, 체력 절반 감소
            double oldHealth = Character.instance.health;
            int decreaseHealth = (int)(Character.instance.health / 2);
            Character.instance.DecreaseHealth(decreaseHealth); // 캐릭터 체력 감소
            Console.WriteLine($"체력 {oldHealth} -> {Character.instance.health}\n");

`Math.Round()`을 해도 `43.0`이 아닌 `43`이 나올거라면 차라리 int형으로 계산해버리자~ 라고 생각해서

나눗셈을 하는 코드를 수정했다.

 

 

해결은 했지만 어쩐지 찝찝한..?

매번 출력때마다 `ToString(N1)` 안해도 좋기는 한데.. double형을 강제로 int형으로 받아버리니까 좀 찝찝했다.

더 좋은 방법이 있는지는 더 찾아봐야겠다.

 

 

 

 

 

 

반응형

댓글