Bei dem round geht es um das runden der Banken. Und darauf bezog sich auch meine Antwort mit dem Gerechter (eben aus der Sicht der Banken). Theoretisch ist es sogar gerecht. Aber trotz dieser mal auf und ab runden wird es dennoch immer wieder eine Seite paar Cent mehr haben. Deshalb gerechter, weil es in der Praxis selten insgesamt (bei mehren Transaktionen oder was auch immer) am ende der Ganzen Rundung, es gleich verteilt ist. Das wäre eher Zufall.
Was dem round selber betrifft: Das ist meiner Meinung nach totaler Quatsch, es sei denn man schreibt nur Finanzprogramme (so wie es die Banker und FPC und Pascal (Delphi) es gerne hätten (?)). Selbst bei einem Wirtschaftsspiel müsste das nicht mal zwingend sein, da es dann ja nur ein Spiel ist. Weil es sich um runden der Banker handelt, erklär es nur ('nur') wieso es abwechselnd auf und ab gerundet wird. Aber es erklärt nicht mal, wieso es round heißt? bankround order roundbank würde da besser passen, finde ich. Und es erklärt auch nicht, wieso es scheinbar keinen direkten Befehl für das in der Schule gelernte und verlässliche Runden gibt. Also ich zieh es auch lieber vor, dass ab 0,5 jedes mal aufgerundet wird. Das sich darauf verlassen können ist mir wichtiger, als dass beim Schreiben (nicht Finanzieller Programme bzw. Codeabschnitten) bzw. dessen Ausführung ... äh, ja was? Das der Programm mal bei 0,5 einen Ganze Zahl bekommt, und das andere mal der Anwender, und das Ganze dann gerecht verteilt wird, oder was? [rionie: Sehr wichtig!] Also damit habe ich allein schon deswegen eher Probleme, weil man dann jedes mal, wenn ein Ergebnis nicht wie erwartet exakt stimmt, auch noch überlegen muss, ob es diesmal auf oder abgerundet werden hätte sollen, um feststellen zu können, ob da wirklich ein Fehler vorliegt, wenn es nur um 1 Ziffer geht.
Es gibt zwar bei der uses Math den Befehl SetRoundMode. Aber habe keinen blassen Schimmer, was der kann, geschweige denn, was für Befehle man da verwenden muss/kann?
Die beste Alternative/Hilfe die mir dazu eingefallen ist, wäre dies:
Code: Alles auswählen
function FNormaleRundung(NormaleRundung: Real): Integer;
begin
result:=trunc(NormaleRundung);
if Frac(NormaleRundung)>= 0.5 then Result:=Result+1;
if Frac(NormaleRundung)<= -0.5 then Result:=Result-1;
end;
Also bei einfachen Test hat es bei mir geklappt.
Edit: Jetzt erst ist mir aufgefallen, dass ja etwas weiter Oben ja ein Beispiel zu diesem Roundmode steht, bzw. mehre. Aber das scheint mir recht umständlich zu sein.