Live-Forum - Die aktuellen Beiträge
Datum
Titel
19.04.2024 12:23:24
19.04.2024 11:45:34
Anzeige
Archiv - Navigation
484to488
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
484to488
484to488
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

problem mit label

problem mit label
15.09.2004 09:52:30
ray
hallo,
auf einer userfrm lasse ich ergebnisse aus berechnungen in label anzeigen.
label 136 soll das ergebniss einer subtraktion anzeigen. dazu mache ich:
Label136 = Label138 - Label110 - Label109
( 138 ist 10279,60, 110 ist 1004,40, 109 ist 9275,20)
wenn ich die label in msgbox ausgeben sind zahlen korrekt.
nur label136 liefert -3,41060513164848E-13
Warum?
Gruß Ray

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: problem mit label
15.09.2004 11:09:11
Axel
Hallo Ray,
da hast du eine zufällige Folge von Operanden erwischt, wo es bei der Subtraktion zu einer Rechenungenauigkeit kommt.
Das hat nichts mit den Labels zu tun, in einer Msgbox oder im Direktfenster wird das selbe fehlerhafte Ergebnis ausgegeben.
Da die Werte in einem Bezeichnungsfeld stehen, werde diese zunächst als normale Zeichenkette, also als String interpretiert.
Beim Rechnen mit Zeichenketten (sofern möglich, und keine Verkettung entsteht, z.B beim +-Operator), wird der Datentyp des Ergebnisses vom Operanden mit der größten Genauigkeit bestimmt.
Die Zahlen besitzen Nachkommawerte und werden deshalb bei der notwendigen Konvertierung intern als Gleitkommazahlen mit 16 Stellen Genauigkeit (Double, 8 Byte) abgebildet.
In diesem speziellen Fall reicht die Genauigkeit aber nicht aus.
Lösung: Du multiplizierst alle Operanden mit einem ausreichenden Faktor um die Nachkommastellen zu eliminieren und dividierst anschließend wieder entsprechend. Bei der Berechnung kommen dann long-Werte zum Einsatz. Das Ergebnis wird korrekt 0 lauten, also hier:
Label136 = (Label138 * 10 - Label110 * 10 - Label109 * 10) / 10
Oder du führst ein explizites Casting auf den Currency-Datentypen durch. Die Rechengenauigkeit beträgt dann 28 Stellen.
also
Label136 = CCur(Label138) - CCur(Label110) - CCur(Label109)
Gruß
Axel
Anzeige
Danke mT
15.09.2004 11:21:46
ray
Dank Dir Axel,
ich habe deine idee
Label136 = (Label138 * 10 - Label110 * 10 - Label109 * 10) / 10
verkürzt in
Label136 = Label138 * 1 - Label110 * 1 - Label109 * 1
Ergebnis ist jetzt richtig, aber ist meine lösung genauso sicher wie deine?
Gruß ray
AW: Danke mT
15.09.2004 11:51:10
Axel
Hallo Ray,
also bei mir funktioniert das nicht. Hätte mich aber auch gewundert, da dadurch nichts gewonnen wird.
Falls das bei dir tatsächlich 0 liefert, vermute ich, das du mit den Bezeichnungsfeldern zuvor noch weitere Operationen durchführst.
Teste das am besten im Direktfenster: ?10279.6*1 - 1004.4*1 - 9275.2*1 liefert dort wie gehabt -3,41060513164848E-13.
Alternativ ginge nur noch: Label136 = CCur(Label138 - Label110 - Label109)
Das Casting mit CCur() ist sicherer als die Multiplikation. Du könntest ja auch Werte mit 2 Nachkommastellen haben, da müsstest du schon mit 100 multiplizieren.
Obige Zuweisung mit dem Cast über die Gesamtsubtraktion ist übrigens rund 30% langsamer als die Zuweisung mit den Einzel-Casts.
Gruß
Axel
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige