Was passiert mit dieser Zeile (abhängig vom generierten Code)?
Brutto1:= DblToCurr4(Netto1 * 1.07);
(Currency(Netto1) * Currency(1.07)) div 10000 ->
((Int64(3738) * int64(10700) = 39996600) div 10000) = 3999
Double(.3999) bekommt 0.39989999999999998 so DblToCurr4(0.39989999999999998) = 0.3999
Das ist nicht das, was wir wollen.
Wie zu tun ?
Code: Alles auswählen
// Ungesteuert Betrag : BetragUS
// Betrag inkl. MwSt. : BetragIMwSt
// Steuersatz in Prozent : SteuersatzPz
function BetragIMwSt_Curr(aBetragUS : Double; aSteuersatzPz : Double) : Currency;
var
lDbl : double;
begin
// It is important to do the calculations in separate statements to
// prevent early conversion to Currency or other uncontrolled compiler
// optimizations !
{ First the biggest multiplication before dividing }
lDbl := (aBetragUS * (100 + aSteuersatzPz)) / 100;
Result := DblToCurr4(lDbl); // Away from 0 rounding to 4 decimal places
end;
Code: Alles auswählen
Netto1:= 0.3738; // Ungesteuert Betrag : Double or Currency as you like
SteuersatzPz := 7; // SteuersatzPz : Double or Currency as you like
// Brutto1 must be a currency to insure fixed point decimal representation
Brutto1 := BetragIMwSt_Curr(Netto1, SteuersatzPz); // Was passiert hier ?
{ Netto1 und WustPz casted zu Double als parameter
so Multiplikation und Division wird mit maximaler Double
Präzision durchgeführt vor weg von 0 Umrechnung zu Currency }