부동소수의 정밀도 처리


void main()
{
uint32 Price = 0;
uint32 Money = 999990000;

Price = static_cast<uint32>(Money * 1.0f);

Price = ???
}

////////////////////////////////////////////////////

Price 같은 경우 999990000 가 나와야 이 코드를 짠 사람이 생각하는 정답이겠지만

실제로는 그렇게 값이 나오지 않을 것입니다.

저 같은 경우에는 999990016 이란 값으로 계속 나오더라구요.

DWORD rate = 1.0;
Price = static_cast<uint32>(Money * rate);

이렇게 바꾸게 되면 제대로 된 값이 나올 것입니다.

정수로 계산을 하면 정상적으로 나오지요.

이러한  꽁수로 해결할 수 도 있습니다.

double TempMoney = 0.0f;
if(Money != 0)
  TempMoney = Money / 100;
Price = static_cast<uint32>(TempMoney * 1.0);
if(Money != 0)
{
  Price *= 100;
  Price += Money % 100;
}

값을 작게하여 정밀도를 높이는 방법 입니다.

값이 클수록 정밀도가 낮아지는 것 같네요.

사소한 실수지만 자잘하게 이상한 값이 나올 수 있으므로 프로그래밍 할 때 주의를

해야할 것 같습니다. 저도 이 부분 때문에 버그가 나버렸네요.

더 좋은 방법이 있다면 꼭 알려주세요.

[참고사이트]

답글 남기기

이메일 주소는 공개되지 않습니다.