상담문의

ㆍ HOME > 상담문의 > 정보처리기사 실기
제 목 캐스트 버그입니다.(답변1)
글쓴이  권우석작성일 2005-03-17조회수 629
글공유
게시글을 twitter로 보내기게시글을 facebook으로 보내기게시글을 Me2Day로 보내기게시글을 요즘으로 보내기

먼저 답변이 늦은 점.. 죄송합니다. 한 번에 답변이 안 올라가서...나누어서 답변 드리겠습니다.



확실한 답변을 위해 이리저리 확인하다 보니 많이 늦었네요...^^



질문하신 내용을 해결하기 위해서는 기사 실기 시험과는 무관하지만...몇 가지 아셔야 할 내용이 있습니다.



첫째는 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                                          



=> 맞습니다.

댓글쓰기 :
이전글 캐스팅 버그입니다.(답변2)
다음글 문제가 안 풀려여..ㅠ.ㅠ
고객지원센터

02-556-3650

평일 9:00~18:00

일요일 공휴일 휴무

계좌번호안내

농협은행 724-01-173541

국민은행 633601-04-044665

예금주 (주)조은캠프

상호명 : (주)조은캠프 ㅣ 대표이사 : 이유락 ㅣ 대구광역시 북구 대학로80 경북대학교 IT융합산업빌딩 11층
사업자번호 : 504-81-62507 ㅣ 본사 : 053-954-0030 ㅣ 기술지원 : 070-7019-1144 ㅣ 팩스 : 050-7711-2200 ㅣ 
원격평생교육시설13호 ㅣ 출판사 : 345-2005-00013 ㅣ 통신판매업 : 2005-대구북구-00158 ㅣ 정보보호책임자 : 김창연  
기사친구는 SSL보안방식의 암호화구간을 적용하여 사이트를 안전하게 이용하실 수 있습니다.
COPYRIGHT 2005 (주)조은캠프 ALL RIGHTS RESERVED.관리자에게 메일보내기