Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#9

AW: MwSt. wird falsch berechnet. (Einige nutzen eine falsche Formel!)

  Alt 2. Jul 2024, 12:03
Mit dem Kettensatz ergibt sich folgende Rechnung.

? € Mwst = 19%
119% = 150.000.000,00 € Brutto

Mwst := 19 * 150.000.000,00 / 119

Mwst := 23949579,831932773109243697478992

Mwst := Round(23949579,831932773109243697478992,2)

Mwst := 23949579,83

Mit dem Windowsrechner kommt 23.949.579,83 € als Mehrwertsteuer heraus.

Hierbei ist es egal ob 19 * Brutto / 119 gerechnet wird oder Brutto * (19 / 119). Was mathematisch ja durchaus korrekt ist.

Aber mit Firebird sieht das anders aus:
SQL-Code:
select
  Round(150000000.000 * (19.000 / 119.000),2) as A,
  Round(19.000 * 150000000.000 / 119.000,2) as B
from RDB$DATABASE;
Hier sind die Werte für A = 23949450,000000000 und für B = 23949579,829999998.
Das entspricht einem Fehler von 129,829999998 €.

Ein zweiter Versuch:
SQL-Code:
select
Round(150000000.00 * (19.00 / 119.00),2) as a,
Round(19.00 * 150000000.00 / 119.00,2) as b
from RDB$DATABASE;
Hier sind die Werte für A = 23940000,000000 und für B = 23949579,830000.
Das entspricht einem Fehler von 9579,83 €.

Ein dritter Versuch:
SQL-Code:
select
Round(150000000.00 * (19 / 119),2) as a,
Round(19 * 150000000.00 / 119,2) as b
from RDB$DATABASE;
Hier sind die Werte für A = 0,00 und für B = 23949579,83.
Das entspricht einem Fehler von 23949579,83 €.

Ein vierter Versuch:
SQL-Code:
select
Round(150000000.00 * 19 / 119,2) as a,
Round(19 * 150000000.00 / 119,2) as b
from RDB$DATABASE;
Hier sind die Werte für A = 23949579,83 und für B = 23949579,83.
Das entspricht einem Fehler von 0,00 €.

Es sind hier mehrere "Besonderheiten" zu beobachten.

Die Reihenfolge der Berechnungen hat wesentliche Auswirkungen auf das Rechenergebnis.
Die Anzahl der Nachkommastellen der Eingabewerte hat wesentliche Auswirkungen auf das Rechenergebnis.
Die Klammersetzung hat wesentliche Auswirkungen auf das Rechenergebnis.

FireBird scheint zwar die Reihenfolge bei der Berechnung (zuerst die Klammerausdrücke) zu beachten, dabei aber bei einer Division von Werten ohne Nachkommastellen auch ein Ergebnis ohne Nachkommastellen zu liefern. Integer / Integer = Integer. Deshalb ergibt Fließkomma * Integer / Integer etwas anderes als Fließkomma * (Integer / Integer).

150.000.000,00 * (19 / 119) ergibt bei FireBird 150.000.000,00 * 0 und nicht 150.000.000,00 * 0,15966386554621848739495798319328.

Die Rechenergebnisse von FireBird sind abhängig von der Anzahl bzw. dem Vorhandensein der Nachkommastellen der Eingabewerten.

Mein Fazit: Rechnen mit FireBird sollte man eher unterlassen oder es muss sehr genau auf die Eigenheiten von FireBird bei der Auswertung der Datentypen und der Klammersetzung geachtet werden.
  Mit Zitat antworten Zitat