Q&A

  • 잘못알고 있는건가 ?
procedure TForm1.Button1Click(Sender: TObject);

begin

label1.Caption := INTTOSTR(ROUND(16.5));

end;



이렇게 하면 16이 나옵니다.



17이 나와야 하는게 아닌가요 ?



(내가 잘못알고 있는건가...T.T)

4  COMMENTS
  • Profile
    강인규 2001.12.06 20:22


    저두 자세한 내부적인 처리방법은 잘 모릅니다만...-_-;



    ROUND는 우리가 산수시간에 배웠던 반올림과는 좀 다릅니다.



    끝자리가 짝수로 끝날 경우엔 .5를 버림하고 홀수로 끝날경우에는 .5를 올림합니다.



    반올림 알고리즘을 구현하기 위해서는 별도의 함수 구현이 필요합니다.



    //델마당에서 이재원님이 올리신 팁입니다.

    Function TForm1.Rnd(aReal : Double):Integer;

    Const

    RndUpCW : Word = $1B32;

    var

    CurCW: Word;

    begin

    CurCW := Default8087CW;

    Try

    Set8087CW(RndUpCW);

    Result:=Round(aReal);

    Finally

    Set8087CW(CurCW);

    End;

    End;





    P.S.

    전 군대에서 포병 사격계산병이었는데 탄도계산할때 이런 알고리즘을 사용합니다.

    그때는 4사6입이라고 불렀는데 그게 정확한 명칭인지는 모르겠네요..-_-;;

    탄도 계산 시 오차를 줄이기 위한 방법이라고 하더군요..

    지금 문서를 찾아보니 이런 방법을 banker's Rounding이라고도 부르는군요..

    즐프하세요~ ^-^/



    나두초보 wrote:

    > procedure TForm1.Button1Click(Sender: TObject);

    > begin

    > label1.Caption := INTTOSTR(ROUND(16.5));

    > end;

    >

    > 이렇게 하면 16이 나옵니다.

    >

    > 17이 나와야 하는게 아닌가요 ?

    >

    > (내가 잘못알고 있는건가...T.T)

  • Profile
    우이씨 2001.12.06 19:33
    > procedure TForm1.Button1Click(Sender: TObject);

    > begin

    > label1.Caption := INTTOSTR(ROUND(16.5));

    > end;

    >

    > 이렇게 하면 16이 나옵니다.

    >

    > 17이 나와야 하는게 아닌가요 ?

    >

    > (내가 잘못알고 있는건가...T.T)



    label1.Caption := INTTOSTR(ROUND(16.49)); ==> 결과 16

    label1.Caption := INTTOSTR(ROUND(16.5)); ==> 결과 16

    label1.Caption := INTTOSTR(ROUND(16.51)); ==> 결과 17

    label1.Caption := INTTOSTR(ROUND(16.52)); ==> 결과 17

    저두 round함수가 정수로 소수첫째자리 반올림을 한다고 배웠는데..

    이러네요.. 먼가 시원한 답변이 필요한거 같습니다.. ^^..

  • Profile
    구창민 2001.12.06 09:52
    나두초보 wrote:

    > procedure TForm1.Button1Click(Sender: TObject);

    > begin

    > label1.Caption := INTTOSTR(ROUND(16.5));

    > end;

    >

    > 이렇게 하면 16이 나옵니다.

    >

    > 17이 나와야 하는게 아닌가요 ?

    >

    > (내가 잘못알고 있는건가...T.T)







    Label1.Caption := Trunc(16.5) + Trunc(Frac(16.5)*2);

  • Profile
    이경문 2001.12.06 13:29
    구창민 wrote:

    > 나두초보 wrote:

    > > procedure TForm1.Button1Click(Sender: TObject);

    > > begin

    > > label1.Caption := INTTOSTR(ROUND(16.5));

    > > end;

    > >

    > > 이렇게 하면 16이 나옵니다.

    > >

    > > 17이 나와야 하는게 아닌가요 ?

    > >

    > > (내가 잘못알고 있는건가...T.T)

    >

    >

    >

    > Label1.Caption := Trunc(16.5) + Trunc(Frac(16.5)*2);



    Label1.Caption := IntToStr(Round(1.5 + .5));

    반올림할 때는 0.5 더해서 Round하는 방법도 있지요 ^^