[Unity] Float 사용시 주의점
게임을 개발하다 보면 float을 사용할때가 정말로 많다.
하지만 float의 계산이 오차가 있기 때문에 항상 조심해서 사용해야 한다.
4byte 변수안에 소숫점까지 다 표현해야하고 일반적인 정수형 변수의 계산이랑은
다르기 때문에 꽤 많은 상황에서 오차가 생기곤 한다
(부동소수점은 IEEE 754 표준을 사용한다)
https://ko.wikipedia.org/wiki/IEEE_754
IEEE 754 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. IEEE 754는 전기 전자 기술자 협회(IEEE)에서 개발한 컴퓨터에서 부동소수점을 표현하는 가장 널리 쓰이는 표준이다. ±0 등의 수와 무한, NaN 등의 기호를 표시하는 법과 이러한 수에 대한 연산을 정의하고 있다. 가장 최신 버전인 IEEE 754-2008은 IEEE 754-1985와 IEEE 754-1997을 대부분 포함한다. IEEE 754에는 32 비트 단정도(single-precision), 64 비트 배정
ko.wikipedia.org
예를 들어 적에게 총알을 맞아서 hp가 깎이는 경우라고 생각했을 때
적의 체력은 10, 총알의 데미지는 2라고 생각해보자
그렇다면 10-2 = 8의 체력이 남아야 되는데 오차때문에 7.99999 등의 숫자가 나오기도 한다.
이게 반복이 되면 밑의 사진과 같은 숫자가 출력되는 것이다....
2.38...E-07이면 0.0000xxx 등의 아주 작은 값이다.
그러나 이 값도 어떻게 보면 0보다 큰 값이기 때문에
이런 조건에서 걸리지 않게 된다... 즉 5발을 맞아야 죽는 적이 6발을 맞아야 죽는 경우가 생긴다는 말씀!
이를 해결하는 방법은 여러가지가 있지만 나는 반올림을 이용해 해결했다.
float 값에 사용하는 자리수 * 10을 곱해서 반올림을 한다. 나는 0.x 번째까지 사용하므로 10을 곱했다.
그런다음 반올림을 하고 다시 사용하는 자리수 / 10을 해주면 완료!
반올림을 하기 때문에 작은 값도 남지않아 제대로 비교를 할 수 있다!
'Unity' 카테고리의 다른 글
[Unity-UniRx] Object Pooling 사용하기 (0) | 2019.10.22 |
---|---|
[Unity-Android] 저사양 기기에서 이미지가 출력되지 않는 경우 (0) | 2019.10.11 |
[Unity] Batching이 미적용 되는 경우 (0) | 2019.10.11 |
[Unity-Mobile] TextMeshPro가 몇몇 안드로이드 기기에서 출력되지 않는 경우 (0) | 2019.09.24 |