대략 학부 1~2학년 시절에 고민했어야할 이야기인 것 같다만, 간단한 프로그램을 짜다가 문제에 봉착했다. 결과값으로 29945를 기대했지만, 실제로 값은 29944가 나왔다. 실수값 연산은 가끔 이런 일이 일어난다.
double v = 299.45;
cout << (int)(v*100.0) << endl;
0.05 단위의 값들(299.40, 299.45 등등)을 처리하다보니 제대로 값이 나오는 것도 있고, 안 나오는 것도 있다. 결국 이래저래 찾아본 결과 아래와 같은 해결책을 제시한다.
cout << (int)(v*100.0+0.5) << endl;
대략 값이 곱셈 후 29944.99999999...가 되어 int로 casting을 하면 버림 처리되어 29944가 된다. 이를 보정해주기 위해 0.5를 더한 후 casting 해준다. 다른 코드들을 보면 0.1을 더한 것도 있고 마음대로인 듯 하다. 문제는, 어떤 c++ 컴파일러에서는 그냥 29945로 나온다는 사실이다. 저렇게 처리를 해주면 문제가 될 것은 없겠다만 뭔가 개운치 못하다.
'[아는게 힘이다] > [프로그래밍]' 카테고리의 다른 글
[CS] 비트 매스크(Bit Mask) (2) | 2010.02.21 |
---|---|
[CS] 반복되지 않는 첫번째 문자를 찾아라 (12) | 2010.02.19 |
[CS] 16진수를 10진수로 바꾸어보자 (0) | 2010.02.18 |
[CS] 배열에서 두번째로 작은 수를 구하기 (2) | 2010.02.18 |