|
안녕하세요.
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("출력 완료");
|