Hallo Leute,
das Stichwort "bankers rounding" hat's gebracht, man muß eben wissen, wonach man suchen muß!
Allerdings kommt "bankers rounding" mit jedem Taschenrechner in Konflikt. Und auf einer Rechnung sollten die Zahlen nun mal stimmen und nicht von der Berechnung mit einem Taschenrechner abweichen. Egal welche logische oder historische Erklärung es für die Abweichung gibt.
Das mathematischen Runden liefert ein Ergebnis, das ein Taschenrechner auch her gibt.
Delphi-Quellcode:
//liefert auf nk-Stellen mathematisch gerundete Zahl r zurück
// MathRound <--> bankers rounding nur bei 0.005
function mround(r : double; nk : integer = 2) : double;
var
diff,
r2,
multi: double;
begin
r2 := abs(r);
multi:=IntPower(10, nk); // uses Math
diff := Frac(r * multi); // Nachkommaanteil von r
// if diff = 0.5 versagt wg. exponentiell kleiner Abweichungen
if round(diff * multi) / multi = 0.5
then r2 := r2 + 0.01 / multi;
if r >= 0
then Result := round(r2 * multi) / multi
else Result := -round(r2 * multi) / multi;
end;
mfg
eddy