|
최우택 님이 쓰신 글 :
:
: double형 변수를 int형 변수로 주는 과정에서 괴이한 현상이 보여서 질문드립니다.
: 2라는 값을 갖고있는 double변수를 int형 변수에게 넘기니까 1로 바뀌어 버리는군요.
: 다른 값.. 그러니까 1이나 8, 9등 2가 아닌 다른 값일때는 안그러는데, 2일때만 그렇고요,
: 항상 그런것이 아니라 프로그램에서 화일로딩/세이브 다이얼로그가 한번 떳다... 하면 그렇게
: 됩니다. 이러저러한 형태로도 고쳐봤지만 모두 결과가 같았고, 대표적으로 다음과 같은 2가지
: 형태에서도 모두 같은 결과가 나타납니다. 혹시나 해서 타입 캐스팅을 해줘도 같은 결과가
: 나오고, 전혀 다른 함수에서 일처리를 해줘도 같은 현상이 일어나는 군요.
:
: 나,인트 = 궁시렁 궁시렁 계산결과 더블형; // 나,인트에 1이 담겨버립니다.
:
: 나,더블형 = 궁시렁궁시렁 계산결과 더블형; // 여기까지는 제대로 계산결과 2가 나오고...
: 나,인트 = 나 더블형; // 더블형은 2를 제대로 갖고 있습니다.
: // 그러나 나,인트는 1을 받아버립니다.
:
:
: 아직까지 다른 부분에서의 버그는 찾지 못핶고요... 일단은 데이터 변수를 몽땅 double
: 형 변수로 고치는 무식한 방법을 써서 그런대로 현재 프로그램은 에러없이 돌아가고 있습니다.
: 4.0엔터프라이즈를 사용하고 있는데, 패치 프로그램들을 돌려줘도 역시 같은 문제가 발생하더
: 군요. 디버깅모드 에서 F8을 눌러가며 변수들을 살펴봐도 천연덕스럽게 데이터가 변질되어버리
: 는데 미치겠습니다. 무언가 잘못되었다는 생각은 들지만.. 혹시 이런문제에 대해 짐작가는 부분
: 이 있으신 분들의 조언 부탁드립니다.
:
PC에 있는 CPU의 플로팅계산 오차때문일 겁니다.
(이에 관해 자세한 내용은 C로 배우는 알고리즘'이나 기타책에서 참고하시길..
컴퓨터가 플로팅을 표현하는 방법을 아시면 됩니다.)
이렇게 해보십시요.
double을 int로 바꾸어줄때
double값이 0보다 크면 +0.5를 더해서(반올림) 캐스팅하시고
0보다 작으면 -0.4 를더해서(맞나.. --;;) 캐스팅해보세여.
double값은 눈에 2라고 보여도 2라고 믿어면 안됩니다.
2에 근사한값으로 생각해야하죠..
|