Moment. So habe ich es in der Schule gelernt. Ab 0,5 und drüber wird aufgerundet, da runter abgerundet. Und nicht auf die nächst gerade Zahl.
Eventuell sollten wir Begriffe definieren. Mathematisch, wie oben beschrieben. Kaufmännisch und dieses Bänker runden.
Mathematisch, siehe oben, wie in der Schule gelehrt.
Über diese verschiedenen Rundungsverfahren habe ich mir schon immer den Kopf zerbrochen.
[KLUGSCHEISSMODUS ON]
Alle drei sind mathematisch korrekte Rundungsmethoden.
kaufmännische Rundung: Alles incl. 0.5 wird aufgerundet.
technische Rundung: 0.5 und darunter wird abgerundet.
mathematische Rundung (bankers rounding):
.00 bis .49 wird abgerundet
.60 bis .99 wird aufgerundet
.51 bis .59 wird aufgerundet
.50 wird derart gehandelt,das die beizubehaltende Zahl zur nächsten geraden Zahl gerundet wird.
Bsp dafür:
2.25 wird zu 2.2
2.35 wird zu 2.4
Letzteres ist bereits auf Prozessor-Ebene so implementiert (zumindest bei x86) und wird standardmäßig
von den entsprechenden Sprachen incl(Delphi....schon seit Turbo Pascal-Zeiten) so für Rundungen verwendet.
https://de.wikipedia.org/wiki/Rundung
[/KLUGSCHEISSMODUS OFF]
und hier mal meine Routine für alle drei Methoden:
Delphi-Quellcode:
TYPE
TRoundMethod = (rmKfm,rmTec,rmMat);
function RoundDirect(zahl:extended;dezimalstellen:Byte;methode:TRoundMethod=rmKfm):extended;
var
hlp,hlp2,di : Extended;
begin
di := Power(10,dezimalstellen);
hlp := trunc(zahl*di);
hlp2 := (zahl*di)-hlp;
case methode of
rmKfm : if (hlp2 >= 0.5) then hlp := hlp+1;
rmTec : if (hlp2 > 0.5) then hlp := hlp+1;
rmMat: begin
if (hlp2 > 0.5) then hlp := hlp+1
else
begin
if (odd(trunc(hlp))) then hlp := hlp +1;
end;
end;
end;
result := hlp/di;
end;