Categories: C, C++

부동소수의 정밀도 처리


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;
}

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

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

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

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

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

[참고사이트]

dingpong

Share
Published by
dingpong

Recent Posts

IHG Points Purchase Promotion: 100% Bonus Points

IHG Points Purchase Promotion: 100% Bonus Points (Until June 29, 2024) 👍 Hello everyone 🖐️🖐️,…

5개월 ago

IHG Summer Stay Bonus Points Promotion (2N2K, 2N3K, 4N8K)

Introduction to IHG Bonus Points Promotion Hello everyone! Today, I'd like to introduce you to…

5개월 ago

LFS error at git checkout in Jenkins

Problem stdout: stderr: Downloading xxxx.a (83 MB) error: git-lfs smudge -- 'xxxx.a' died of signal…

3년 ago

플레이모빌 크리스마스 XXL 6629 산타 해외직구 구매가 배송비

https://www.playmobil.de/playmobil-xxl-weihnachtsmann/6629.html 구매가 : 48.49 유로 (플레이모빌 독일 홈페이지) 결제하는데 안되서 PayPal 로 결제하니 잘 잔행…

4년 ago

코카콜라 제로 355ml 72캔 구매가 (캔당 453원)

롯데온에서 355ml 24캔 롯데카드로 구매시 13,210원 https://www.lotteon.com/p/product/PD36294 APP으로 35,000원 이상 구매시 7,000 포인트 적립 행사…

4년 ago

경동나비엔 온수매트 EQM541-QS (퀸사이즈) 구입가

구입 매장 : 현대 홈쇼핑 (홈쇼핑 방송 중) 모바일 앱 http://www.hyundaihmall.com/front/pda/itemPtc.do?slitmCd=2114353981 최종 결제 가격 :…

4년 ago