PDA

Vollständige Version anzeigen : Was ist hier falsch? Fehler in Access?


Steffen
24.01.2001, 10:50
Hallo Forum,

ich will eine Tabelle mit fortlaufenden Zahlenwerten (Single) füllen. Hier mein VB-Code:


Private Sub cmdFillTbl_Click()
Dim DB As Database
Dim RS As Recordset
Dim sglZ As Single
Dim lngL As Long

Set DB = CurrentDb
Set RS = DB.OpenRecordset("tblZahl", DB_OPEN_DYNASET)

sglZ = 0.0001
For lngL = 1 To 100
RS.AddNew
RS!sglZ = sglZ
RS.Update
sglZ = sglZ + 0.0001
Next lngL

RS.Close
DB.Close
End Sub

Nun sollte man annehmen, daß folgende Werte in der Tabelle erscheinen:
0,0001
0,0002
0,0003
0,0004
... usw.

aber das steht drin:
sglZ
0,0001
0,0002
0,0003
0,0004
0,0005
0,0006
0,0007
0,0008
0,0009
9,999999E-04 - warum steht hier nicht 0,0010?
0,0011
0,0012
0,0013
0,0014
0,0015
0,0016
0,0017
0,0018
1,899999E-03
1,999999E-03
2,099999E-03

Am Zahlenbereich von Single kann es doch eigentlich nicht liegen. Wenn ich den Wert runden würde wäre er ja wieder richtig, aber in meinen Augen ist 0,0010 <> 0,0009999999.

Vielen Dank im voraus.

Steffen

Günther Kramer
24.01.2001, 10:55
Hallo Steffen,

weshalb muß es denn ein Single-Feld sein? Damit habe ich nur Pobleme gehabt und alle Datetypen in Double geändert. Wir persönlich werden nie wieder Single-Felder verwenden.

Steffen
24.01.2001, 11:29
Hallo Günther,

vielen Dank für Deine schnelle Antwort.
Du hast Recht, bei der Verwendung von Double gibt es scheinbar keine Probleme mehr. Wie sieht das eigentlich mit sehr kleinen Zahlenwerten aus?
Normalerweise vernachlässigbar aber streng gesehen ist
0,0069 <> 0,00690000000000001
bei Access ist es aber gleich.


sglZ
0,0001
0,0002
0,0003
0,0004
0,0005
0,0006
0,0007
0,0008
0,0009
0,001
0,0011
0,0012
0,0013
0,0014
0,0015
0,0016
0,0017
0,0018
0,0019
0,002
0,0021
0,0022
0,0023
0,0024
0,0025
0,0026
0,0027
0,0028
0,0029
0,003
0,0031
0,0032
0,0033
0,0034
0,0035
0,0036
0,0037
0,0038
0,0039
0,004
0,0041
0,0042
0,0043
0,0044
0,0045
0,0046
0,0047
0,0048
0,0049
0,005
0,0051
0,0052
0,0053
0,0054
0,0055
0,0056
0,0057
0,0058
0,0059
0,006
0,0061
0,0062
0,0063
0,0064
0,0065
0,0066
0,0067
0,0068
6,90000000000001E-03
7,00000000000001E-03
7,10000000000001E-03
7,20000000000001E-03
7,30000000000001E-03
7,40000000000001E-03
7,50000000000001E-03
7,60000000000001E-03
7,70000000000001E-03
7,80000000000001E-03
7,90000000000001E-03
8,00000000000001E-03
8,10000000000001E-03
8,20000000000001E-03
8,30000000000001E-03
0,0084
0,0085
0,0086
0,0087
0,0088
0,0089
0,009
0,0091
0,0092
0,0093
0,0094
0,0095
0,0096
0,0097
0,0098
0,0099
0,01

Nockenwelle
24.01.2001, 12:38
Hallo,

das ist ein Rundungsfehler. Access zeigt dann nur Kram an. Zumindest die letzte angezeigt Stelle ist dann nur noch ein Schätzwert, der beim Vergleich nicht mehr hinzugezogen wird. Sowas sieht dann auch immer besonders gut aus.
Bei double kann das wohl auch auftreten, aber ich glaube erst nach 13 Stellen hinter dem Komma.

Cu

Steffen
24.01.2001, 13:56
Hallo Nockenwelle,

vielen Dank für Deinen Beitrag.
Ich verstehe aber nicht, warum Access bei einer normalen Addition von 0,0001 plötzlich auf die n-te Nachkommastelle rundet.
Laut Karl Donaubauer sind die Fließkommaberechnungen generell und Access-Datentypen ungenau. Kann man an dieser Stelle also von einem Access-Bug sprechen?
Heißt das, daß berechnete Werte vor ihrer Weiterverarbeitung/Speicherung gerundet werden sollten?

dm

Stephan
25.01.2001, 00:58
Schreib mal so: (Access hat so kleine interne Rundungsschwierigkeiten)


Function test()
Dim DB As Database
Dim RS As Recordset
Dim sglZ As Single
Dim i As Long

Set DB = CurrentDb
Set RS = DB.OpenRecordset("tblZahl", DB_OPEN_DYNASET)

For i = 1 To 100
sglZ = i / 10000
RS.AddNew
RS!sglZ = sglZ
RS.Update
Next i

RS.Close
DB.Close
End Function