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형으로 받아버리니까 좀 찝찝했다.
더 좋은 방법이 있는지는 더 찾아봐야겠다.
반응형
'스파르타 게임개발종합반(Unity) > TIL - 본캠프 매일 공부 기록' 카테고리의 다른 글
2024.04.29 TIL - GitHub 브랜치 생성 삽질한 기록 (0) | 2024.04.29 |
---|---|
2024.04.26 TIL - enum, Json 문제점 (1) | 2024.04.26 |
2024.04.24 TIL - Item 클래스의 상속, 인터페이스, 다중 상속 (0) | 2024.04.24 |
2024.04.23 TIL2 - 캡슐화, 상속, 다형성, 추상화, 객체, 오버로딩, 오버라이딩, 프로퍼티, Virtual, Abstract, 제너릭, out, ref (0) | 2024.04.23 |
2024.04.23 TIL1 - VisualStudio 디버깅, 삼항 연산자, List, Dictionary, Stack, Queue, HashSet, struct (0) | 2024.04.23 |
댓글