Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Kai1712 am Februar 03, 2023, 15:03:48

Titel: Matheproblem in VBA
Beitrag von: Kai1712 am Februar 03, 2023, 15:03:48
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
Titel: Re: Matheproblem in VBA
Beitrag von: Josef P. am Februar 03, 2023, 15:13:21
Hallo!

Welche Datentypen sind im Einsatz?

Gruß
Josef
Titel: Re: Matheproblem in VBA
Beitrag von: markusxy am Februar 03, 2023, 15:16:05
Ich schätze mal der Steuersatz ist Single - auf jeden Fall kein Double ;)
Titel: Re: Matheproblem in VBA
Beitrag von: MzKlMu am Februar 03, 2023, 15:33:47
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.
Titel: Re: Matheproblem in VBA
Beitrag von: ebs17 am Februar 03, 2023, 15:41:56
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.
Titel: Re: Matheproblem in VBA
Beitrag von: Josef P. am Februar 03, 2023, 15:54:06
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
Titel: Re: Matheproblem in VBA
Beitrag von: Kai1712 am Februar 06, 2023, 14:30:05
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
Titel: Re: Matheproblem in VBA
Beitrag von: Beaker s.a. am Februar 06, 2023, 14:37:42
Warum nicht "Currency"? Das ist doch genau für solche Daten gemacht.
Titel: Re: Matheproblem in VBA
Beitrag von: MzKlMu am Februar 06, 2023, 15:07:13
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.