Funktionparameter-Typen werden bei 3.2.3. anders behandelt.

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
BrunoK
Beiträge: 5
Registriert: So 19. Jun 2022, 13:42

Re: Funktionparameter-Typen werden bei 3.2.3. anders behandelt.

Beitrag von BrunoK »

Win fpc 3.2.2 x86_64

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;
Dann in Program :

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 }
I speak french, so maybe translation is bad ...

Antworten