Zitat von
Sourcemaker:
ich bin gestern von einem Kunden über eine Rundungsproblematik hingewiesen worden.
Das Problem tritt bei den Funktionen FormatFloat und Str auf. Eine Berechnung die im
vorliegenden Fall 9,32 EUR ergeben müsste 3,45*3/0,9=9,315 wird durch die o.g. Funktionen
als 9,31 EUR ausgegeben.
Es gibt da zwei
verschiedene Rundungsverfahren:
* Kaufmänisches Runden: bei x.5 wird immer aufgerundet
* "Banker's rounding": bei x.5 wird abwechselnd auf- und abgerundet
Delphi verwendet "Banker's rounding". Die Auf- und Abrundungen sollen sich in der Masse gegenseitig aufheben.
Kaufmännisches Runden geht so:
Delphi-Quellcode:
function CommercialRound(const X: Extended): Int64;
begin
Result := Trunc(X);
if Frac(Abs(X)) >= 0.5 then
Result := Result + Sgn(X);
end;
Die Art & Weise, mit der die Funktion Round() arbeitet, hängt übrigens von der aktuellen
Einstellung des FPU Flags-Registers ab.
(Wahrscheinlich die Ursache für unterschiedlichem Verhalten von Round auf versch. Rechnern)