VBA für Excel - Double vergleichen

Hallo,

ich habe ein merkwürdiges Problem.

Ich extrahiere aus einem String zwei Teilstrings, z.B. „0.1“ und „0.2“. Diese sollen als Zahlenwerte verglichen werden, dazu nutze ich Val(), um die Teilstrings in Zahlen umzuwandeln, und Abs(), um die Differenz der beiden Zahlen absolut zu erhalten. Die Differenz darf einen bestimmten Wert nicht überschreiten, darf aber gleich sein.

Aus irgendeinem Grund, schafft er es nicht, in meinem Programm genau das zu tun. Er schafft den Vergleich über "
Sub DoubleVergleichTest()

Dim hoechstDifferenz, istDifferenz As Double
Dim wert1, wert2 As String

hoechstDifferenz = 0.1
wert1 = „0.1“
wert2 = „0,2“
istDifferenz = Abs(Val(wert1) - Val(wert2))

'zur Ausgabe
MsgBox (istDifferenz

Bei diesem Codebeispiel funktioniert es allerdings! In meinem echten Beispiel nicht. Ich habe alles 3x nachkontrolliert und mache bei mir wirklich nichts anderes. Der einzige Unterschied besteht darin, dass in meinem echten Programm die Teilstrings über Mid() belegt werden und in dem kleinen Beispiel direkt.

Ich denke, es ist eben irgendein Typproblem oder so. Habe allerdings keine Ahnung, woran es liegen kann. Falls jemand einen Tipp hat, wäre ich sehr dankbar! Vielen Dank schon mal.

Hoffnungsvolle Grüße,
Elisabeth

Moin, Elisabeth,

wert1 = „0.1“

hier Punkt als Dezimaltrenner,

wert2 = „0,2“

hier Komma - Absicht oder vertippt?

istDifferenz = Abs(Val(wert1) - Val(wert2))

Keine Ahnung, was bei der berechnung rauskommt :frowning:

Gruß Ralf

Hallo Ralf,

wert1 = „0.1“

hier Punkt als Dezimaltrenner,

wert2 = „0,2“

hier Komma - Absicht oder vertippt?

War in dem Fall Absicht, um zu schauen, ob es irgendeinen Unterschied macht. In dem Beispiel funktioniert es aber trotzdem, weil er aus beiden Werten Double-Zahlen macht (0,1 und 0,2).

istDifferenz = Abs(Val(wert1) - Val(wert2))

Keine Ahnung, was bei der berechnung rauskommt :frowning:

Das Val konvertiert die beiden Strings in Zahlen-Werte, in diesem Fall in 0,1 und 0,2, die beiden ziehe ich voneinander ab und da es um die reine Differenz geht, mache ich eben eine absolute Differenz mit Abs. Bei istDifferenz sollte dann 0,1 rauskommen (0,2 - 0,1)…
Wie gesagt, in diesem kleinen Beispiel klappt es - nur in meinem Programm nicht :frowning:

Vielleicht hat irgendjemand ein paar Anregungen, woran es liegen könnte (bestimmt irgendein Typen-Fehler denk ich!?)?

Hallo,

Val(„0.1“) liefert ‚0‘
Val(„0,2“) liefert ‚0,2‘

Es kommt dabei also -0,2 raus. Genau, was Du erwartet hast.

Gruß Rainer

Hi,

ich habe es gerademit VB6 versucht, da geht das nicht.
Aus '0.1" wird ‚0‘.

Aber was immer geht:

txt = „0,2“
Ergebnis = CDbl(Replace(txt, „.“, „,“))

Gruß Rainer

Hallo Rainer,

die Diskussion geht gerade etwas in die falsche Richtung :wink:

Ich habe eigentlich mit Punkt und Komma kein Problem, da meine Werte immer mit Punkt vorliegen - darauf kann ich mich verlassen.
Mit Punkt klappt es auch eigentlich, hatte das mit dem Komma allerdings noch gar nicht bemerkt --> danke für die Info, doch noch was gelernt.

Was mich wirklich wundert ist die Tatsache, dass ich beim Debuggen für meine beiden Werte in der Anwendung nach anwenden von Val „0,1“ und „0,1“ kriege - die beiden Werte kann er in meinem Mini-Programm auch vergleichen. Nur im großen klappt es nicht. Wenn ich auf "

Hallo Elisabeth,

hab dein Beispiel nicht porbiert, hatte aber mal ein ähnliches Problem. Tatsächlich waren (sind?) Zahlen nicht immer identisch, auch wenn sie so aussehen. Damals, unter TurboPascal, nach mehrstündigem Debuggen beim Hersteller angerufen. Erste und einzige Antwort: „Man geht nicht über = sondern über eine Fehlerschranke.“

Meine (damalige) „Erklärung“: Bei einem Vergleich werden alle bits verwendet, auch „nicht sichtbare“ im Sinne des Zahlenwertes.
(Kann man sich das unter VB anschauen?)

Sofern nicht noch eine andere Lösung auftaucht: Fehlerschranke etwas „überhöhen“, also ungefähr so > 0,0000000000001 statt = 0.

Ist sicher keine Lösung, aber vieleicht eine Erklärung.

biba

Dirk.Pegasus

Hallo Elisabeth,

Wenn ich auf "

1/2 = 0.500 ist zu gross
1/4 = 0.250 passt mal, Rest 0.05
1/8 = 0.125 ist grösser als 0.05, passt nicht
1/16 = 0.0625 ist zu gross
1/32 = 0.03125 passt wieder

Wir haben bis jetzt als Summe:
0.25 + 0.03125 = 0.28125
Gerundet wird das als 0.3 angezeigt.
Du kannst die Liste selber noch genauer rechnen.

0.25 oder 0.28125 wären kein Problem für eine exakte Umwandlung. Die Stellenzahl ist nicht wirklich das Problem !

MfG Peter(TOO)

1 Like

Bei diesem Codebeispiel funktioniert es allerdings! In meinem
echten Beispiel nicht. Ich habe alles 3x nachkontrolliert und
mache bei mir wirklich nichts anderes. Der einzige Unterschied
besteht darin, dass in meinem echten Programm die Teilstrings
über Mid() belegt werden und in dem kleinen Beispiel direkt.

Hallo Elisabeth,

ist das Problem jetzt aufgrund der Hinweise hier gelöst?

Falls nicht haben wir ja nix von einem Code der funktioniert.
Wir brauchen Code der nicht funktioniert.

Gruß
Reinhard

Hallo dirk.pegasus!

Vielen Dank für die Infos - sowas in der Art dachte ich mir schon und hatte gehofft, es gibt irgendeine sinnvolle andere Möglichkeit des Vergleichs. Werde aber den Tipp mit der Fehlerschwelle gleich am Montag mal testen - sollte für meine Zwecke in jedem Fall reichen, denn so viele Nachkommastellen werden bei mir definitiv nicht vorkommen, müsste also klappen.

Also nochmal vielen Dank …
Elisabeth

Hallo Peter(TOO),

vielen Dank für die Infos, habe schon in einem anderen Posting geschrieben, dass ich mir bereits dachte, dass mein Problem in diese Richtung geht. Ich war bloß einfach verwirrt, dass es in meinem kleinen Beispiel, in dem ich ja „eigentlich“ den gleichen String über Val() umwandle geklappt hat?! Aber ich nehme einfach mal an, dass man über solche Konvertierungsfunktionen kein definitives Ergebnis bekommen kann.

Wie auch immer, werde es also anders lösen - mal schauen ob das klappt. Gehe aber mal davon aus, dass ich es mit diesen ganzen Infos hinkriege :wink:

1000 Dank also auch an Dich (und alle anderen, die sich an der Lösung beteiligt haben …)!
Elisabeth

Hi Elisbeth,

Vielen Dank für die Infos - sowas in der Art dachte ich mir
schon und hatte gehofft, es gibt irgendeine sinnvolle andere
Möglichkeit des Vergleichs.

? Was ist, wenn „If A-B =0“ nicht klappt an "If A-B

Hallo Reinhard,

du hast natürlich recht, befriedigend ist das nicht. Aber wenn es so ist, ist das die einzige Chance.

biba

Dirk.Pegasus

OT genauigkeit beim Rechnen

du hast natürlich recht, befriedigend ist das nicht. Aber wenn
es so ist, ist das die einzige Chance.

Hallo Dirk,

man kann da schon was macchen.

Ich hatte mal den Link zu einer schönen Seite wo sich jmd. die Mühe machte die vier Grundrechnungsarten aber auch sehr viel darüber hinaus, kompleze Zahlen, Potenzieren usw, nachzubauen.

Natürlich darf man dann nicht mehr CDBl(…) für eine 100stellige Kommazahl benutzen.
Ich nehme an man muß alle Zahlen als Strings vorliegen haben.
Das Rechenergebnis ist dann erstmal wieder ein String.

Nun ist es aber so wenn du zwei zahel mit je 50 Nachkommastellen addierst so hat das Ergebnis auch 50 nachkommastellen.
Multiplizierst du sie aber so erhöht sich ggfs. ja die Anzahl der Nachkommastellen.
Irgednwann, nach mehreren Multiplikationen kommt man ja dann auch zu der Entscheidung, runde ich nach der 200ten Kommastelle oder laß das so weiterlaufen o.ä.

Einerseits ist das Spielerei, anderseits für Spezialfälle in der Mathematik, Physik, sonstwo durchaus mal sehr notwendig.

Leider ist der Link zu der Seite verschollen :frowning:

Gruß
Reinhard