Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1404to1408
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Schleife mit 1000 Schritten -> ungenaue Werte

Schleife mit 1000 Schritten -> ungenaue Werte
05.02.2015 14:32:17
Fred
Hallo miteinander,
folgende Schleife mit einer Schrittweite von 0.001 nutze ich in einer anderen Prozedur.
Bei der 688. Schleife liefert Excel dann nicht 0.688 sondern 0,688000000000001. Im Ergebnis führt das dazu, dass die 1000. Schleife nicht mehr ausgeführt wird, weil das Schleifen-Ende nicht 1 ist, sondern 1,000000000000001 ist.
Wie kann ich das Problem lösen, wenn ich die Schrittweite als "0.0irgendwas" eingeben will?
Dim Increment_NOK As Double

Sub SchleifeFehlerhafteRundung()
Increment_NOK = 0.001
Zeile = 2
For DeltaZ = 0 To 1 Step Increment_NOK
Worksheets("Tabelle1").Cells(Zeile, 1).Value = DeltaZ
Zeile = Zeile + 1
Next DeltaZ
End Sub

Danke für sachdienliche Hinweise,
Fred
PS. Lösen kann ich das Problem, in dem ich die Schleife mit ganzen Zahlen laufen lasse, aber dann muss ich (und das will ich vermeiden) an mehreren Stellen umrechnen in meiner Prozedur:
Sub SchleifeKorrekteRundung()
Increment_Z = 1
Zeile = 2
For DeltaZ = 0 To 1000 Step Increment_Z
Worksheets("Tabelle1").Cells(Zeile, 2).Value = DeltaZ / 1000
Zeile = Zeile + 1
Next DeltaZ
End Sub
Die Beispieldatei findet sich unter
https://www.herber.de/bbs/user/95580.xlsm

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Schleife mit 1000 Schritten -> ungenaue Werte
05.02.2015 15:37:25
Rudi
Hallo,
aufgrund der Ungenauigkeiten beim Handling von Gleitkommazahlen wirst du um Möglichkeit 2 nicht herumkommen.
Ich würde allerdings auf 3 Nachkommastellen gerundete Zahlen in die Zellen schreiben, da sonst dort die Ungenauigkeit auftreten kann.
Bei 1 musst du die Schrittweite nicht angeben.
Gruß
Rudi

AW: Schleife mit 1000 Schritten -> ungenaue Werte
05.02.2015 16:16:48
Fred
Hallo Rudi,
danke für die Antwort. Da die Schrittweite bei mir dynamisch ist, muss man dann halt auch beim Runden dynamisch umsetzen.
Schade und etwas beunruhigend, dass Excel da eine Schwäche hat.
Gruß,
Fred

AW: Schleife mit 1000 Schritten -> ungenaue Werte
05.02.2015 16:21:04
Rudi
Hallo,
das liegt nicht an Excel sondern am Prinzip der Gleitkommazahlen.
Gruß
Rudi

Anzeige
Schleife mit Do....Loop
05.02.2015 16:28:50
Rudi
Hallo,
so geht das:
Sub SchleifeFehlerhafteRundung()
Dim Increment_NOK As Single, DeltaZ As Single, Zeile As Long
Increment_NOK = 0.001
Zeile = 2
Do While DeltaZ 

Gruß
Rudi

Den Varianten zum Decimal machen
05.02.2015 16:59:49
HabIchNicht

Sub SchleifeFehlerhafteRundung()
Increment_NOK = 0.001
zeile = 2
For deltaZ = CDec(0) To 1 Step Increment_NOK
Worksheets("Tabelle4").Cells(zeile, 7).Value = deltaZ
zeile = zeile + 1
Next deltaZ
End Sub

AW: Den Varianten zum Decimal machen
06.02.2015 09:41:42
Fred
Hallo HabIchNicht,
es tut - so wie gewünscht. Danke für die gute Lösung.
Wieso steht das CDec bei der "0" und nicht bei "Increment_NOK" (wo es dann aber auch funktioniert)?
Vielleicht hast Du nochmal eine Minute zur Erläuterung - vielen Dank,
Fred

Anzeige
AW: Den Varianten zum Decimal machen
06.02.2015 19:00:25
HabIchNicht
Hallo
da du keine Variablen deklariest werden alle von dir verwendeten Variablen (Increment_NOK, zeile, DeltaZ) vom Compiler automatisch vom Datentyp Variant auf deinem Stack abgelegt. Wenn du diesen Varianten einen Zahlenwert ohne Angabe des Datentyps zuordnest, muss der Compiler erraten welcher Datentyp das jetzt ist. Hierfür hat der Compiler logische Regeln, Wertigkeiten(IntegerTypen(long, integer, byte) kleiner Float) und Preferenzen(z.b. beim Floattyp immer Double). Sind der/die Datentyp(en) bekannt so kommt folgende Wertigkeitsregel zur Anwendung (IntegerTypen(long, integer, byte) kleiner Float kleiner Decimal). Daher ist es unerheblich wo cdec seine Anwendung findet (cdec(0), cdec(1), cdec(Increment_NOK) oder auch Increment_NOK = cdec(0.001)). Wichtig ist das dem Varianten deltaZ der Datentyp dezimal zugeordnet wird, welcher nicht dem ungenauigkeitsproblem der Floatdatentypen(Single, Double) bei der Berechnung unterliegt, weil er anders organisiert und berechnet wird.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige