먼저 답변이 늦은 점.. 죄송합니다. 한 번에 답변이 안 올라가서...나누어서 답변 드리겠습니다.
확실한 답변을 위해 이리저리 확인하다 보니 많이 늦었네요...^^
질문하신 내용을 해결하기 위해서는 기사 실기 시험과는 무관하지만...몇 가지 아셔야 할 내용이 있습니다.
첫째는 Type Cast(형식 캐스트):자료형 강제 변형, 형변환 개녕입니다....
그리고 두번째는 비베는 특이한 반올림법입니다.(Banker''''s Rounding)
결론은 비베에서 반올림에 대한 여러가지 버그(해결안되는)가 있습니다.
질문에 대해 하나하나 답을 올리겠습니다.
==========================================================================
Option Explicit Sub main() Dim 값(3) As Long Dim 합계 As Long 값(1) = 20.5 값(2) = 30.1 값(3) = 40.1 합계 = 값(1) + 값(2) + 값(3) MsgBox 합계 End Sub 이 프로그램에서는 합계 결과값이 90이 나옵니다
=> 타입 캐스트(자료형 강제 변형)에 의해 반올림되었습니다. 왜 90이 나오냐면...
Microsoft 제품에는 사용할 수 있는 라운딩 알고리즘이 많습니다. 라운딩 알고리즘은 Excel의 워크시트 Round() 함수에 있는 산술 라운딩(Arithmetic Rounding)부터 Visual Basic for Applications의 CInt(), CLng() 및 Round() 함수에 있는 Banker''''s Rounding에 이르기까지 다양합니다.
Banker''''s Rounding
라운딩한 값들을 더할 때 .5를 항상 같은 방향으로 라운딩하면 합계의 편중 오차가 커질 수 있습니다. 편중 오차를 최소화하는 한 가지 방법은 Banker''''s Rounding을 사용하는 것입니다.
Banker''''s Rounding에서는 상황에 따라 .5를 반올림하거나 잘라냅니다. 1.5와 2.5는 둘 다 2로 라운딩하고 3.5와 4.5는 둘 다 4로 라운딩하는 방식으로 가장 가까운 짝수로 라운딩하는 것이 규칙입니다. Banker''''s Rounding은 대칭적입니다.
(일반 연산) : 1.5 + 2.5 +3.5 +4.5 = 12 (Round 반올림) : Round(1.5) + Round(2.5) + Round(3.5) + Round(4.5) = 12 (수학적 반올림) : 2 + 3 + 4 + 5 = 14
=> 결론은 0.5 일때 상황에 따라 반올림 결과가 다릅니다. 가까운 짝수로 라운딩된다고 생각하시면 됩니다. 그래서...91이 아니라..20+30+40의 합인 90이 되었습니다.
Option Explicit Sub main() Dim 값(3) As Long Dim 합계 As Long 값(1) = 20.6 값(2) = 30.1 값(3) = 40.1 합계 = 값(1) + 값(2) + 값(3) MsgBox 합계 End Sub 이 프로그램에서는 합계 결과값이 91이 나옵니다
디버그해보니, 첫번째프로그램에선 값1이 20, 두번째프로그램에선 값1이 21로 읽히더군요 그래서 소수점이 .6부터 반올림이 된다고 생각했습니다~ 그런데..
=> 맞습니다.
Option Explicit Sub main() Dim 값(3) As Double Dim 합계 As Long 값(1) = 20 값(2) = 30.5 값(3) = 40 합계 = 값(1) + 값(2) + 값(3) 값과 합계의 변수타입을 다르게 지정했을 때 MsgBox 합계 이 프로그램에선 합계 값이 90이 나왔어여~ End Sub
=> 맞습니다. |