Q&A

  • Double 형 변수의 계산오류?
Double 형 변수계산식 코드와 결과값입니다.
결과값이 이상하게 나오는 원인을 알고싶습니다.
Double 형 대신에 Currency 형을 쓰면 정확한 값이 나오긴 합니다.
하지만 Currency형은 소숫점이 4자리까지만 표현하기때문에.. 소숫점 5자리 이상은 계산을 못하네요~
해결방법으론 Double 대신에 String을 써서 계산하면 되긴하겠지만.. 워낙 코딩이 길어져서~ ^^ㅋ

//코드
procedure TForm1.Button2Click(Sender: TObject);
var
  i : double;
begin
  Memo1.Clear;
  i := -2;

  while i <= 2 do
  begin
    Memo1.Lines.Add(FloatToStr(i));
    i := i + 0.01;
  end;
end;

//결과
-2
-1.99
-1.98
-1.97
...
-1.03
-1.02
-1.01
-0.999999999999999
-0.989999999999999
-0.979999999999999
...
-0.119999999999998
-0.109999999999998
-0.0999999999999983
-0.0899999999999984
-0.0799999999999984
...
-0.0199999999999984
-0.00999999999999837
1.63390114426513E-15
0.0100000000000016
0.0200000000000016
...
0.980000000000002
0.990000000000002
1
1.01
2  COMMENTS
  • Profile
    홍성락 2002.03.18 22:32
    ////////////////////////////////////////////////////////
    전에도 같은 질문이 있었는데요...
    FloatToStr가원래 Extended형의 실수로 정확도(significant digits.)는 15이고
    general number format이므로 Double형이 안맞는 경우가 발생합니다.
    그래서 이럴경우 저는 4가지중 하나를 썼었습니다.
    1방법.FloatToStrF를 사용하되 general number format이 아닌 ffFixed로사용하시던지
    2방법. FormatFloat등 일반 Format류의함수를 사용하시던지
    3방법. 위 변수 i를 Extended형으로 사용하시던지
    4방법.FloatToStr대신 CurrToStr함수를 사용해보시던지요.

    다른방법도 많을겁니다. 저는 3이나 4방법을 많이 썼습니다.
  • Profile
    정진우 2002.03.19 02:44
    설명하신 방법들은 문자열로 표현해주기 위한 방법들이고요~
    계산된 값은 소숫점부분이 이상한것 같습니다.
    아래와 같은 코드일때 -1값을 못찾습니다.
    전에 표현한 -1 값은 -0.999999999999999 값으로 인식하는것 같은데요~

    procedure TForm1.Button2Click(Sender: TObject);
    var
      i : double;
    begin
      i := -2;

      while i <= 2 do
      begin
          if i = -1 then
            Showmessage('-1 값입니다.');
        i := i + 0.01;
      end;
    end;


    • 유창원
    • 2002.03.19 04:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 유창원
      2002.03.19 07:44
      스스로 해결을 해버렸군요. 아 갈길은 멀고도 험하구나.... 간단한 소스는 자료실에 올라가 있습니다.(78...
    • 정성훈
    • 2002.03.19 03:58
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 최석기
      2002.03.19 04:19
      방법이 두가지 있네요 1. FormatFloat('#,##0',1000) 2. Format('%.0n',[1000.00]
    • 정성훈
      2002.03.19 04:34
      님의 답변 정말 감사합니다. 그런데.. ... var a : String; begin a := '10000'; Edi...
    • 최석기
      2002.03.19 05:16
      이궁... 에러가 뜨면 왜 에러가 뜨는지 함 도움말 찾아보는 습관을 들이는게 좋을 듯 싶네요.. forma...
    • 정성훈
      2002.03.19 06:05
      님 덕분으로.. 문제 해결.. 님 정말 감사해요.^^
    • 미소나눔
      2002.03.19 04:07
      procedure TForm1.Button2Click(Sender: TObject); var   s : string;   n, pos : ...
    • freelab
    • 2002.03.19 03:39
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 홍성락
      2002.03.19 05:14
      /////////////////////////////////////////////////////// 속성중에 wordwrap을 False로하세요.
    • 이영석
    • 2002.03.19 03:27
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 공성환
      2002.03.19 03:28
      sum을 하기전에... select sum(nvl(필드값,0))          .... ...
    • BlueSea
    • 2002.03.19 03:25
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 김경록
      2002.03.20 02:24
      DB 서버가 어떤 종류인가여? DB서버가 있는 OS는 어떻게 되는가여?
    • 공성환
      2002.03.19 03:27
      데이타베이스가 어떤건지는 모르지만... 트리거이벤트를 사용해보세요...
    • 염상철
      2002.03.19 19:35
      with query1 do begin       close;      &nb...
    • BlueSea
      2002.03.20 23:50
      답변 해주신 분들 먼저 감사합니다. 근데 트리거는 테이블에 Insert나 update가 될때 발생되는건데 ...
    • 나두초보!!
      2002.03.20 20:28
      마스타, 디테일로.. 퀵리포트에 rbDetail에.. 고객상세 rbSubDetail.... 기타테이블로 자식들의 dat...
    • 김경록
      2002.03.20 02:33
      이건 한몫에 끝내기란 다소 시간이 많이 걸리거나.. 잘 안될 소지가 보이네여.. 델파이6에서는 어떻게 지...
    • 문상준
    • 2002.03.19 02:25
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 칼리
      2002.03.19 02:49
      같은 네트워크상의 컴터는 실아이피 라는 말이 애매하군요. 공인 고정 IP인지? 아니면 내부에서 사용하...
    • 문상준
      2002.03.19 09:56
      실아피라 함은 고정아이피란 말입니다.. 그리고 핑은 떨어집니다.. reply xxx.xx.xxx.xx 뭐 이런식으...
    • 김기수
      2002.03.19 01:52
      아래와 같이 WideString으로 바꾸면 됩니다.
    • 미소나눔
      2002.03.19 04:04
      procedure TForm1.Button1Click(Sender: TObject); var   n, i, max : integer;   ...
    • 김경록
      2002.03.20 02:38
      물론 될것이라 판단됩니다.. (실제로 업무에서도 그렇게 사용한 후에 배포를 했었습니다..) 파라독스도 ...
    • 박성훈
    • 2002.03.19 00:57
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.03.19 04:43
      안녕하세요. 최용일입니다. 흠... .inc파일 보시면 $ifdef 문이 보이실겁니다. 이게 해답이네요... ...
    • Delphi Kim
    • 2002.03.18 22:56
    • 1 COMMENTS
    • /
    • 0 LIKES
    • Delphi Kim
      2002.03.19 00:34
      아쒸.....울 나라를 어케 보구...쩝!!! delphi6에 있는 install shield 버그랍니다... 고쳐달라구 얘...
    • 김진석
    • 2002.03.18 21:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 신동훈
      2002.03.19 06:04
      저도 잘은 모르지만... 델파이 오랫동안 안쓰다고 요즘 다시 쓰기시작하는터라... 혹시 다음과 같이 코...
    • 정진우
    • 2002.03.18 21:39
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 홍성락
      2002.03.18 22:32
      //////////////////////////////////////////////////////// 전에도 같은 질문이 있었는데요... FloatToS...
    • 정진우
      2002.03.19 02:44
      설명하신 방법들은 문자열로 표현해주기 위한 방법들이고요~ 계산된 값은 소숫점부분이 이상한것 같습니다...
    • 김동일
    • 2002.03.18 20:53
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 박상윤
      2002.03.27 08:53
      pas 파일이있으면 컴파일을 다시 하시면 됩니다... 만약 형이 맞지 안거나 하면... 비슷한 형으로 바궈주...
    • 염상철
    • 2002.03.18 20:33
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 초보임당
      2002.03.18 20:45
      mdi child 불러 올때 제가 쓰는 거고여... mdi child 폼은 프로퍼티에 폼 스타일을 fsMDIChild로 바꾸어 ...
    • 염상철
      2002.03.18 20:51
      일반폼을 불러 오고 싶은건데.. form1.show; form1.showmodal; 을 하면 에러가 나는데 그냥 불러 와 지...
    • 초보임당
      2002.03.18 21:05
      일반 폼은여 ...form style 을 nomal 로 바꾸시고 역시 옵션에서 일단      &n...
    • 장명선
    • 2002.03.18 20:21
    • 0 COMMENTS
    • /
    • 0 LIKES