Option Explicit Sub main() Dim 값(3) As Double Dim 합계 As Long 값(1) = 20.1 값(2) = 30.3 값(3) = 40.1 합계 = 값(1) + 값(2) + 값(3) MsgBox 합계 End Sub 그런데 이프로그램에선 합계값이 91이 나왔습니다..
=> 이 부분을 설명하기가 참 어렵네요...
''세'' Double 타입 수를 더하니 이상하더라." 요건데..
위에서 정확히 0.5일 때만 근짝수 반올림을 한다고 이미 했는데요,
그러면 세 Double 타입 수를 더하면 0.5가 아니라 더 큰 수가 나온다고 볼 수 있습니다.
아래 예제를 좀 보면요..(단, 값()은 Double이고 합계는 Long임)
값(1) = 20.125 값(2) = 30.25 값(3) = 40.125 합계 = 값(1) + 값(2) + 값(3) MsgBox 합계 ''90 값(1) = 20.1 값(2) = 30.3 값(3) = 40.1 합계 = 값(1) + 값(2) + 값(3) MsgBox 합계 ''네번째 경우죠. 91 값(1) = 20.125 값(2) = 30.225 값(3) = 40.15 합계 = 값(1) + 값(2) + 값(3) MsgBox 합계 ''90 값(1) = 20.175 값(2) = 30.3125 값(3) = 40.0125 합계 = 값(1) + 값(2) + 값(3) MsgBox 합계 ''91
그리고 두 Double 수의 연산의 경우에
값(1) = 20 값(2) = 30.5 합계 = 값(1) + 값(2) MsgBox 합계 ''50
값(1) = 20.15 값(2) = 30.35 합계 = 값(1) + 값(2) MsgBox 합계 ''50 값(1) = 20.1 값(2) = 30.4 합계 = 값(1) + 값(2) MsgBox 합계 ''50
이란 말이죠.
그러니까 이상하게 세 Double 타입 수만 더하면 그러는건데...
그래서 4개 5개로도 테스트를 해봤는데 상당히 재밌는 결과가 나왔습니다.
하나의 변수로 0.5를 몰아주면 근짝수 반올림이 되고,
0.4와 0.1로 나눠서 저장해도 역시 같은 결과가 나왔는데,
엉뚱하게 0.3, 0.1, 0.1로 나눠주니 일반 반올림이 되버렸다는 겁니다.
0.2, 0.1, 0.1, 0.1 도 마찬가지였고, 각각 0.1만 해도 마찬가지였습니다.
그런데.
이런 연산을 C로 해봤더니 그런 현상은 전혀 없었습니다.
C의 연산이 다분히 저급언어적임을 고려하면, VB에서의 이러한 현상이 자동 타입 캐스트의 문제라는 것을 대번에 짐작할 수 있었습니다.
이긍....
그래서 결론...
캐스팅 과정에서 발생한 버그임....
참고로...
http://support.microsoft.com/kb/q196652/
를 읽어 보시면 좋을 듯... 지금까지 답변은 여러 고수님의 의견을 조합한 답변이였습니다.
이해가 많이 어려울 듯 합니다. 설명이 부족한 듯 하네요...즐거운 주말 저녁되세요.
|