Autor Beitrag
steiniman
Hält's aus hier
Beiträge: 3

Win98, WinXP
D4 prof
BeitragVerfasst: Mo 01.12.03 12:40 
Hallo,

ich habe folgendes Problem. Aus einer txt-Datei werden Zeile für Zeile Daten ausgelesen und diese in eine db geschrieben. Dies geht auch soweit gut.

Jedoch ab der 20sten Zeile wird die Umwandlung StrToFloat ungenau.
So werden aus 1,22, die als String korrekt ausgelesen werden, ein ungenauer Wert von 1,22000002861023 in der Datenbank (bei Anzeige in einem Label (ohne db-Ansteuerung) übrigens auch).

Die Daten in der txt-Datei wurden im Text-Editor erfasst und sind korrekt.
Welche Ansatzpunkte gibt es zur Lösung des Problemes?

Muss sich die Funktion zwischendurch "erholen"? :?
Payne85
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 53

Win2k
D3 Pers, D7
BeitragVerfasst: Mo 01.12.03 15:40 
Wenn es nicht so dermaßen unkorekt ist, dann schneide doch einfach die restlichen stellen die du nicht brauchst ab. Das problem hatte ich noch nie,wüsste auch nicht woran es liegen könnte.
Mfg

_________________
Mitleid gibts umsonst, Neid muss man sich verdienen...
steiniman Threadstarter
Hält's aus hier
Beiträge: 3

Win98, WinXP
D4 prof
BeitragVerfasst: Mo 01.12.03 15:53 
ich habe es schon mit FloatToDezimal versucht. Aber innerhalb dieser Schleife scheint Delphi auf Kriegsfuß mit allem zu sein, was einem Float ähnelt :D
Payne85
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 53

Win2k
D3 Pers, D7
BeitragVerfasst: Mo 01.12.03 15:58 
Erstmal herzlich willkommen im Delphi forum :D
Zeig doch mal n schnipsel code bzw. die ganze Procedure
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: Mo 01.12.03 16:01 
Das ist ein Rundungsfehler. Falls du den Datentyp "Single" verwendest, versuch mal double, damit sollte das Problem beseitigt sein.
steiniman Threadstarter
Hält's aus hier
Beiträge: 3

Win98, WinXP
D4 prof
BeitragVerfasst: Mo 01.12.03 17:09 
Also mit double hab ich es versucht Ergebnis:= :schmoll: sagt mein Delphi.

Damit der Fehler sich ja nicht verstecken kann, hier die ganze Prozedur (Hinweis: als DB verwende ich Accuracer von aidaim - sollte jedoch hier nicht relevant sein, da der Fehler auch ohne db-Ansteuerung auftritt):

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
...
var
f: TextFile;
fl1,fl2,fl3:double;
i1, i2, i3,lines,steps: integer;
da1,da2: tdate;
st1,st2,line: string;

begin
dat.db_z.sql.text:='SELECT Count (*) AS i3 FROM zinssatz';
dat.db_z.ExecSQL;
dat.db_z.Open;
if dat.db_z.IsEmpty = true then i1:=0 else i1:=dat.db_z.fields[0].asinteger;
if wordia.Execute then
   begin
   AssignFile(f, wordia.FileName);
   Reset(f);
   lines := 0;
    while not eof(f) do
    begin
         Readln(f, line);
         lines := lines + 1;
    end;
    CloseFile(f);
    steps := lines div 10;
    Reset(f);
    Readln(f, line);
    Readln(f, line);
    i2 := strtoint(copy(line,9,3));
    if i2 > i1 then
       begin
    Save_Cursor := Screen.Cursor;
    Screen.Cursor := crSQLWait;    { Cursor als Sanduhr }
    Readln(f, line);
    while not eof(f) do
    begin
         fl1:=0;
         fl2:=0;
         fl3:=0;
         Readln(f, line);
         da1:= StrTodate(copy(line,1,10));     
         da2:= StrTodate(copy(line,12,10));    
         fl1:= StrToFloat(copy(line,23,5));    
         fl2:= StrToFloat(copy(line,29,5));    
         st1:= copy(line,35,20);               
         fl3:= StrToFloat(copy(line,56,5));    
         st2:= copy(line,62,20);               
         dat.db_z.SQL.Text:='SELECT Count (*) AS i3 FROM table where zab = '+Quotedstr(datetostr(da1));
         dat.db_z.ExecSQL;
         if dat.db_z.IsEmpty = true then
            begin
            dat.db_z.sql.text:='SELECT * FROM table';
            dat.db_z.ExecSQL;
            dat.db_z.Open;
            dat.db_z.ReadOnly:=false;
            dat.db_z.Insert;
            dat.db_z.fieldbyname('basis').Asfloat:= fl1;
            dat.db_z.fieldbyname('zab').AsDateTime:=  da1;
            dat.db_z.fieldbyname('zbis').AsDateTime:= da2;
            dat.db_z.fieldbyname('prizins').asfloat:= fl2;
            dat.db_z.fieldbyname('prizinspara').AsString:= st1;
            dat.db_z.fieldbyname('buszins').AsFloat:= fl3;
            dat.db_z.fieldbyname('buszinspara').asstring:= st2;
            dat.db_z.fieldbyname('gesprizins').AsFloat:= fl2;
            dat.db_z.fieldbyname('gesbuszins').asfloat:= fl3;
            dat.db_z.post;
            end;
        end;
     end;
   dat.db_z.sql.text:='SELECT * FROM table';
   dat.db_z.Open;
   Screen.Cursor := Save_Cursor;  { Alten Zustand wiederherstellen }
   end;