Q&A

  • (급)Round 함수가 이상해요. 도와주세요...
안녕하세요...델코 애용자입니다.



(질문으로)

저희 회사에서는 델파이로 개발을 끝내고 업무에 실제 적용을 하고 있습니다.

그런데... Round 함수가 이상한 결과값을 준다는 사실을 몇일전에 알았습니다.

여러 데이타를 비교해도 이상해서 계산기까지 수동으로 두들겨 보았지요...



예를들어 Round(11.0562 * 112,000) => 1,238,294 (참인 결과값)

그런데, 1,238,295 라는 결과값이 떨어지는 것입니다.



같이 작업을 하셨던 분들도 이런 말씀을 하시더군요...

' 델파이에서 쓰는 Round 함수는 아무래도 4부터 반올림을 하는 것 같다'라구요...



보기에는 1원 차이지만,,, 업무상 오차는 용납되지 않는 곳이 사회이게에... =.=;;

저희가 함수를 더 거창하게 쓰거나 한 것도 없구요.

단지 곱한값을 round 한것 밖에는 없거든요.



물론 SQL문을 돌려서 쓰면 문제는 해결되겠지만 Round를 쓴 .pas 파일이 한둘이

아닌지라 해결책을 문의 드립니다.



정말 급합니다. 빠른 답변 부탁드리겠습니다.

고맙습니다. 이만 총총. *^^*



3  COMMENTS
  • Profile
    유섭 1999.09.14 03:09
    이미형 wrote:

    > 안녕하세요...델코 애용자입니다.

    >

    > (질문으로)

    > 저희 회사에서는 델파이로 개발을 끝내고 업무에 실제 적용을 하고 있습니다.

    > 그런데... Round 함수가 이상한 결과값을 준다는 사실을 몇일전에 알았습니다.

    > 여러 데이타를 비교해도 이상해서 계산기까지 수동으로 두들겨 보았지요...

    >

    > 예를들어 Round(11.0562 * 112,000) => 1,238,294 (참인 결과값)

    > 그런데, 1,238,295 라는 결과값이 떨어지는 것입니다.

    >

    > 같이 작업을 하셨던 분들도 이런 말씀을 하시더군요...

    > ' 델파이에서 쓰는 Round 함수는 아무래도 4부터 반올림을 하는 것 같다'라구요...

    >

    > 보기에는 1원 차이지만,,, 업무상 오차는 용납되지 않는 곳이 사회이게에... =.=;;

    > 저희가 함수를 더 거창하게 쓰거나 한 것도 없구요.

    > 단지 곱한값을 round 한것 밖에는 없거든요.

    >

    > 물론 SQL문을 돌려서 쓰면 문제는 해결되겠지만 Round를 쓴 .pas 파일이 한둘이

    > 아닌지라 해결책을 문의 드립니다.

    >

    > 정말 급합니다. 빠른 답변 부탁드리겠습니다.

    > 고맙습니다. 이만 총총. *^^*

    >



    저도 이런 경우를 봤는데.



    Round함수에 수식을 넣어면 오차가 발생하고...



    예1) t2 := Round(1293/100 * 100)



    변수를 이용하는경우...



    예2) t1 := 1293/100 * 100

    t2 := round(t1);



    위의 예제에서는 오류가 없지만 예1)과 예2)의 경우 다른 결과 값이 나오는



    경우가 있었습니다.



    예2)와 같이 변수를 이용해보세요...



  • Profile
    이재식 1999.09.13 22:11
    네, 그런 경우가 있습니다.

    델파이 4에 패치 3을 쓴다면 값은 정확히 나옵니다.

    그런데, 그것이 아니라면 이렇게 해보세요.

    Round함수는 bankers rounding 방법을 써요.

    값이 가장 가까운 수로 짤리죠.

    그런데, 종종 실수 계산에서 그런 경우가 발생하는데요,

    이 기능을 써보세요. 그럼 될것입니다. 혹 이것이 안되면

    다시 수학연산을 이용해서 정확한 Round를 구현하는 방법이 있죠.

    일단은 이렇게 해보세요.

    t라는 변수가 있다고 가정하고

    t에는 이런 식이 있다고 하죠.

    t := 11.0562 * 112000 ;

    그런데 최종 정확히 Round한 값을 갖고 싶다면

    함수를 이용하거나 나름대로 작성해서 이렇게 공식을 쓰세요.

    value := Trunc(t) + Trunc(Frac(t) * 2) ;

    그러면 정확한 Round값은 결국 value라는 변수가 가지게 되는 거죠.

    한번 해보세요. 학교다닐때 round함수의 수학연산을 공부하다가

    배운건데...

    그럼 도움이 되셨기를.

  • Profile
    chaser 1999.09.13 19:38
    이미형 wrote:

    > 안녕하세요...델코 애용자입니다.

    >

    > (질문으로)

    > 저희 회사에서는 델파이로 개발을 끝내고 업무에 실제 적용을 하고 있습니다.

    > 그런데... Round 함수가 이상한 결과값을 준다는 사실을 몇일전에 알았습니다.

    > 여러 데이타를 비교해도 이상해서 계산기까지 수동으로 두들겨 보았지요...

    >

    > 예를들어 Round(11.0562 * 112,000) => 1,238,294 (참인 결과값)

    > 그런데, 1,238,295 라는 결과값이 떨어지는 것입니다.

    >

    > ....



    제가 위 예를 테스트 했는데 정상적인 결과(1,238,294)가 나왔습니다.

    어째서 그쪽은 다른 결과가 나왔는지 모르겠군요.



    테스트는 아래와 같이 했습니다.



    showmessage(floattostr(Round(11.0562 * 112000) ));



    참고로 저는 Delphi4 Update3 버전 입니다.



    그래도 안되시면 그쪽에서 테스트한 소스를 올려주시면 제가 다시 테스트를 해보지요.