C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[20773] float 형 변수에 관한 문의
궁금이 [] 1079 읽음    2002-08-13 08:45
안녕하세요.

float형에 관한 문의입니다.

변수 하나를 만들고

예컨대,

float a;

a= a + Table1->FieldByName("필드명")->AsFloat;

라는 식으로 해서 DB의 특정 테이블의 값을 누적해서 더하고 있습니다.
(참고로 위 필드명에 해당하는 값은 소수점 첫째짜리 까지 값이 있습니다.)

이를 그냥 format 함수를 쓰지 않고 소수점 둘째자리 이하에 숫자에 이상한 값이 들어갈때가 있습니다.

그런데 Format 함수를 써서 소수점 첫째짜리 까지 하면 값이 잘 나오구요.

가끔은 그 값이 틀리게 나올때도 있습니다.

어떤식으로 해야지 정확한 값이 나올까요??

아래에 소스 일부분을 덧붙입니다.

    float hap1=0;                    //모래
    float hap2=0;                    //자갈
    float hap3=0;                    //OS
    float hap4=0;                    //보조기층

    float danga1=8500;                    //모래
    float danga2=5500;                    //자갈
    float danga3=5300;                    //OS
    float danga4=6500;                    //보조기층
    int count=0;

    bool flagTitle=true;
//    bool flagNextPage=false;

    AnsiString Gonggu;
    AnsiString Yymmdd;

    float Y=0;
    int i=0;

    TPrinter* p = Printer();
    p->Orientation = poPortrait; //poLandscape 출력 방향
    TCanvas* c = p->Canvas;
//    HDC dc = c->Handle;           //프린터 캔버스의 핸들을 정의

    p->BeginDoc();
    int XPI = GetDeviceCaps(c->Handle, LOGPIXELSX);
    int YPI = GetDeviceCaps(c->Handle, LOGPIXELSY);

    c->Font->Size =10;

    Gonggu = Table1->FieldByName("필드1")->AsString;
    Yymmdd = Table1->FieldByName("필드2")->AsString;

    Table1->First();


  
    while(!Table1->Eof) {

       i++;
       count++;
       ProgressBar1->Position = (i/Table1->RecordCount)*100;      
       if(flagTitle) {
          //전 그룹의 각 합계 출력
          p->NewPage();
          c->Font->Size =12;
          c->Font->Style =(c->Font->Style << fsBold);
          SetTextAlign(c->Handle,TA_CENTER);
          c->TextOut( 3.0*XPI, 0.5*YPI,"자동차 반출 집계표");

          c->TextOut( 2.0*XPI, 1.0*YPI,"날짜");

          c->TextOut( 4.0*XPI, 1.0*YPI,"20"+Table1->FieldByName("필드2")->AsString.SubString(1,2)+"년 "+
                                            Table1->FieldByName("필드2")->AsString.SubString(3,2)+"월 "+
                                            Table1->FieldByName("필드2")->AsString.SubString(5,2)+"일 "  );

          c->TextOut( 1.0*XPI, 1.2*YPI,"번호");
          c->TextOut( 2.0*XPI, 1.2*YPI,"차량번호");
          c->TextOut( 3.2*XPI, 1.2*YPI,"수량");
          c->TextOut( 4.2*XPI, 1.2*YPI,"반출시간");
          c->TextOut( 5.2*XPI, 1.2*YPI,"품명");
          c->TextOut( 6.3*XPI, 1.2*YPI,"거래처");
          c->TextOut( 7.0*XPI, 1.2*YPI,"비교");
          c->TextOut( 2.0*XPI, 1.4* YPI, "===============================================================================================");
          c->Font->Size =10;

          flagTitle=false;         
          Y=0;
          i=1;
      }

        if(Table1->FieldByName("필드10")->AsString !="" && Table1->FieldByName("필드8")->AsString !=""){
          if(Table1->FieldByName("필드10")->AsString =="1"){
               hap1 = hap1 + Table1->FieldByName("필드8")->AsFloat;
          }
          else if(Table1->FieldByName("필드10")->AsString =="2"){
               hap2 = hap2 + Table1->FieldByName("필드8")->AsFloat;
          }
          else if(Table1->FieldByName("필드10")->AsString =="3"){
               hap3 = hap3 + Table1->FieldByName("필드8")->AsFloat;
          }
          else if(Table1->FieldByName("필드10")->AsString =="4"){
               hap4 = hap4 + Table1->FieldByName("필드8")->AsFloat;
          }
        }

        SetTextAlign(c->Handle,TA_LEFT);
        c->TextOut(    1.0*XPI, (1.5+Y)*YPI,Table1->FieldByName("필드3")->AsString);                    //   번호")
        c->TextOut(    1.5*XPI, (1.5+Y)*YPI,Table1->FieldByName("필드4")->AsString+                     //   차량1"
                                             Table1->FieldByName("필드5")->AsString+                    //  "차량2
                                             Table1->FieldByName("필드6")->AsString+                    //   "차량3
                                             Table1->FieldByName("필드7")->AsString );                  //   "차량4
        c->TextOut(    3.0*XPI, (1.5+Y)*YPI,Table1->FieldByName("필드8")->AsString);                    //   수량")
        c->TextOut(    4.0*XPI, (1.5+Y)*YPI,Table1->FieldByName("필드9")->AsString.SubString(1,2)+" : " +
                                            Table1->FieldByName("필드9")->AsString.SubString(3,2) );    //   시간")
        c->TextOut(    5.0*XPI, (1.5+Y)*YPI,Table1->FieldByName("필드11")->AsString);                   //   품명")
        c->TextOut(    6.0*XPI, (1.5+Y)*YPI,Table1->FieldByName("필드12")->AsString);                   //   거래처

        Y += 0.2;
        Table1->Next();

    if((i%45)==0) {
      flagTitle = true;
    }

    if(Yymmdd != Table1->FieldByName("필드2")->AsString || Table1->Eof) {
        if((i%45) <38) {
        Y +=0.2;
        c->TextOut(    3.0*XPI, (1.5+Y)*YPI,"모래 " + FormatFloat("###,###,###.#",hap1));
        c->TextOut(    4.5*XPI, (1.5+Y)*YPI,          FormatFloat("###,###,###,###,##0",hap1*danga1));
        Y +=0.2;
        c->TextOut(    3.0*XPI, (1.5+Y)*YPI,"자갈(25MM) " + FormatFloat("###,###,###.#",hap2));
        c->TextOut(    4.5*XPI, (1.5+Y)*YPI,                FormatFloat("###,###,###,###,##0",hap2*danga2));
        Y +=0.2;
        c->TextOut(    3.0*XPI, (1.5+Y)*YPI,"O.S " + FormatFloat("###,###,###.#",hap3));
        c->TextOut(    4.5*XPI, (1.5+Y)*YPI,         FormatFloat("###,###,###,###,##0",hap3*danga3));
        Y +=0.2;
        c->TextOut(    3.0*XPI, (1.5+Y)*YPI,"보조기층 " + FormatFloat("###,###,###.#",hap4));
        c->TextOut(    4.5*XPI, (1.5+Y)*YPI,              FormatFloat("###,###,###,###,##0",hap4*danga4));
        Y +=0.2;
        c->TextOut(    3.0*XPI, (1.5+Y)*YPI,"합계 " + FormatFloat("###,###,###.#",hap1+hap2+hap3+hap4));
        c->TextOut(    4.5*XPI, (1.5+Y)*YPI,              FormatFloat("###,###,###,###,##0",hap1*danga1+hap2*danga2+hap3*danga3+hap3*danga4));
        }
        else {
        Y=0;
        p->NewPage();
        c->TextOut(    3.0*XPI, (1.5+Y)*YPI,"모래 " + FormatFloat("###,###,###.#",hap1));
        c->TextOut(    4.5*XPI, (1.5+Y)*YPI,          FormatFloat("###,###,###,###,##0",hap1*danga1));
        Y +=0.2;
        c->TextOut(    3.0*XPI, (1.5+Y)*YPI,"자갈(25MM) " + FormatFloat("###,###,###.#",hap2));
        c->TextOut(    4.5*XPI, (1.5+Y)*YPI,                FormatFloat("###,###,###,###,##0",hap2*danga2));
        Y +=0.2;
        c->TextOut(    3.0*XPI, (1.5+Y)*YPI,"O.S " + FormatFloat("###,###,###.#",hap3));
        c->TextOut(    4.5*XPI, (1.5+Y)*YPI,         FormatFloat("###,###,###,###,##0",hap3*danga3));
        Y +=0.2;
        c->TextOut(    3.0*XPI, (1.5+Y)*YPI,"보조기층 " + FormatFloat("###,###,###.#",hap4));
        c->TextOut(    4.5*XPI, (1.5+Y)*YPI,              FormatFloat("###,###,###,###,##0",hap4*danga4));
        Y +=0.2;
        c->TextOut(    3.0*XPI, (1.5+Y)*YPI,"합계 " + FormatFloat("###,###,###.#",hap1+hap2+hap3+hap4));
        c->TextOut(    4.5*XPI, (1.5+Y)*YPI,              FormatFloat("###,###,###,###,##0",hap1*danga1+hap2*danga2+hap3*danga3+hap3*danga4));
        }

        hap1=0;
        hap2=0;
        hap3=0;
        hap4=0;

        Yymmdd = Table1->FieldByName("필드2")->AsString;
        flagTitle = true;
     }

   }
   p->NewPage();
   p->NewPage();
   p->NewPage();
   p->EndDoc();
   ShowMessage("출력 완료");  

+ -

관련 글 리스트
20773 float 형 변수에 관한 문의 궁금이 1079 2002/08/13
30353     Re:float 형 변수에 관한 문의 왕대박 826 2002/08/13
30352     Re:float 형 변수에 관한 문의 류현 1061 2002/08/13
20775     double 써~ =ㅅ=;; 에보니.$ㅅ$ 766 2002/08/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.