Ich denke das ist falsch, ich kann mich jetzt erinnern, in einem Buch gelesen zu haben, dass wenn das Ergebnis einer Berechnung die Grenzen der involvierten Typen überschreitet, dann wird das Ergebnis zu nächst höheren Typ umgewandelt und wenn die zugewiesene Variable von der kleineren Typ ist, dann wird eine Compiler-Meldung ausgegeben.PascalDragon hat geschrieben: Di 14. Jun 2022, 09:24 Der Typ eines Ausdrucks hängt in Pascal grundsätzlich nicht davon ab wohin der Wert des Ausdrucks zugewiesen wird, sondern einzig von den im Ausdruck selbst involvierten Typen. Sind also alle im Ausdruck involvierten Typen Currency, so wird auch in Currency berechnet und nicht in einem Fließkommatyp.
Was wäre eine Sprache Wert, wenn die rechte Seite immer als Integer zurückgegeben wird, wenn die Multiplikation die Integer-Grenze überschreitet, aber in Grenzen von LongInt bleibt?
LongInt:= Integer * Integer;
Außerdem habe ich hier mit (StSatz / 100) keine reine Currency-Variablen mehr:
PreisRunden(Netto * ((StSatz / 100) +1));
Edit: Ignoriert folgenden Text, ich habe bei der Hektik Fehler gemacht. Einer der Variablen in der Formel war Double, dann wurde alles Double.
Ich habe bei 64Bit Compiler noch ein merkwüriges Verhalten entdeckt, wenn man diese Funktion:
Code: Alles auswählen
function PreisRunden(const Value: extended): extended;
var multi, X: extended;
begin
writeln('Value: ',Format('%.6f', [Value])); ///test
multi := IntPower(10, gZfPreiseStelle);
X:= Value * multi;
Result := (Trunc(X) + Trunc(Frac(X) * 2)) / multi;
end;
Code: Alles auswählen
function PreisRunden(const Value: extended): extended;
var multi, X: extended;
begin
writeln('Value: ',Format('%.6f', [Value]));
Result := Value;
end;
Es wird am Ende sogar beim zuweisen zu Brutto1-Variable (Currency) aufgerundet und das ist das richtige Verhalten, nämlich beim Zuweisen der Variable auf 4 Nachkommastellen aufrunden und nicht bei Zwischenergebnisse.
Es ist eindeutiger Fehler von 64Bit-Compiler.
Der Typ Extended hat in dieser ganzen Diskussion überhaupt keine Bedeutung. Das alles passiert auch wenn man Extended mit Double ersetzt-