Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Matheproblem in VBA

Begonnen von Kai1712, Februar 03, 2023, 15:03:48

⏪ vorheriges - nächstes ⏩

Kai1712

Servus Z´ammen,
hätte gerne mal Eure Meinung dazu:
Es soll eine Rechnung berechnet werden

    Brutto = Me.Nettobetrag.Value * (1 + STsatz)
    Brutto2 = Me.Nettobetrag.Value * (1.19)

STsatz ist der Steuersatz aus einer Tabelle und enthält den Wert 0,19
Und jetzt kommts! Schaut was beim Debugen im Haltemodus bringt:

? Brutto
 10737,1554832899
? Brutto2
 10737,154967

Beim Runden kommen dann oben 16 Cent raus und unten 15.

Hat Irgendeiner ne Idee warum Access hier falsch rechnet?

Danke im Voraus und Grüße sendet
Kai

Josef P.

Hallo!

Welche Datentypen sind im Einsatz?

Gruß
Josef

markusxy

Ich schätze mal der Steuersatz ist Single - auf jeden Fall kein Double ;)

MzKlMu

Hallo,
Single ist als Datentyp für solche Rechnungen völlig ungeeignet, ist viel zu ungenau. Für den Betrag ist Währung zu verwenden. Für den Steuersatz Double, oder auch Währung. Das € kann man unterdrücken.
Gruß Klaus

ebs17

Zitatwarum Access hier falsch rechnet?

Der Kern Deiner Frage: Ist 1 + 0,19 ungleich 1,19? Hast Du das explizit geprüft?

Erst danach würde man sich eine Multiplikation anschauen und ob da gleiche Werte verwendet werden, selbstredend unter den formulierten Bedingungen.
Mit freundlichem Glück Auf!

Eberhard

Josef P.

Hallo!

Zum Ausprobieren und darüber Nachdenken: ;)
Dim Brutto As Variant
Dim Brutto2 As Variant
Dim Nettobetrag As Variant
Dim STsatz As Variant
Dim F As Variant

Nettobetrag = CDbl(9022.8193)
STsatz = CSng(0.19)
'STsatz = CDbl(0.19)

F = (1 + STsatz)
Brutto = Nettobetrag * F
Debug.Print Brutto, F, VarType(F)


F = 1.19
Brutto2 = Nettobetrag * F
Debug.Print Brutto2, F, VarType(F)

Gruß
Josef

Kai1712

Danke an alle für die Antworten.
Es hing in der Tat am Steuersatz mit Variablen Typ 4 (Single). Danke an Klaus mit der Empfehlung auf Double zu gehen.  :)
Krass, das die falsche Wahl der Variable sich schon auf einen Cent auswirkt. Bei tausenden von Buchungen kann sich ds richtig rentieren  ;)  ;D

Noch ein Phänomen das ich beobachtet habe: Durch die Umstellung der Variable in der MariaDB wurde die 0.19 nicht so übernommen :o . In der Tabelle der MwSt-Sätze stand 0.18999999634584 und 0.159999997653642 (sinngemäß).

Danke Josef für den Code. Damit kann man es echt gut nachvollziehen.

Viele Grüße sendet
Kai

Beaker s.a.

Warum nicht "Currency"? Das ist doch genau für solche Daten gemacht.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MzKlMu

Hallo,
@Kai
ZitatKrass, das die falsche Wahl der Variable sich schon auf einen Cent auswirkt.
Das hat zunächst einmal gar nix mit Access zu tun, das ist das Problem der Fließkommadarstellung mit einer Rechenmaschine die nur 0 und 1 kennt.
Das Problem hast Du bei jedem Taschenrechner, nur ist es dort nicht sichtbar bzw. wird unterdrückt. Je weniger Bytes Du für eine Zahl verwendest, je größer wird der Fehler. Single verwendet 4 Bytes und Double 8.
Währung verwendet intern eine Ganzzahl und fügt nur ein Komma ein. 123,45€ wird als 1234500 gespeichert und dann nur das Komma wie erforderlich eingefügt. Da gibt es dann kein Fließkomma.
Schlage mal bei Wikipedia "Fließkomma" nach, da gibt es dann einen Mathematikkurs.  :)
Alles was mit Geldbeträgen zu tun hat, ist Währung sinnvoll. Auch beim Steuersatz könnte Währung verwendet werden. Das € Zeichen kann unterdrückt werden.
Gruß Klaus