Round/de
Rundet eine Fliesskommazahl auf eine Ganzzahl.
Round
Deklaration
function Round(X: Real): Longint;
Beispiel
Code
var
i: Integer;
begin
WriteLn( Round(8.7) );
WriteLn( Round(8.3) );
// Beispiele für "Banker-Runden" - .5 wird auf die nächste gerade Zahl eingestellt
WriteLn( Round(2.5) );
WriteLn( Round(3.5) );
i := Round(12.50); // Rundet ab
WriteLn(i);
i := Round(12.51); // Rundet auf
WriteLn(i);
end.
Ausgabe
9 8 2 4 12 13
Banker-Runden
Die Funktion Round verwendet das Banker-Runden und rundet daher bei 0,5 zur nächsten geraden Zahl. Daher ist die Wahrscheinlichkeit für Auf- und Ab- runden bei Zufallszahlen exakt 50:50.
Es eignet sich sehr gut für statistische oder finanzmathematische Anwendungen. Bei grafischen Anwendungen – zum Beispiel beim Zeichnen von Bildern – ist das nicht immer von Vorteil. Hierdurch zeichnet folgendes Beispiel keine durchgehende Linie, sondern eine Gepunktete.
Code:
var
i: integer;
x: single = 0.5;
begin
for i := 0 to 99 do begin
Canvas.Pixels[round(x), 20]:= $00;
WriteLn('Input:', x: 6: 2, ' round: ', Round(x): 4);
x := x + 1.0;
end;
end;
Ausgabe
Input: 0.50 round: 0 Input: 1.50 round: 2 Input: 2.50 round: 2 Input: 3.50 round: 4 Input: 4.50 round: 4 ....
Alternativen
Zum Abrunden kann Trunc verwenden werden.
Mit der Prozedur SetRoundMode(ARoundMode)
aus der Unit Math kann der Rundungsmodus für alle folgenden Aufrufe von Round() eingestellt werden. Der Parameter ARoundMode
kann folgende Werte annehmen:
rmNearest
: Rundet zum nächsten Integer, bei x.5 zum nächsten geraden Integer (Banker's Rounding)rmDown
: Roundet generell zum nächstkleineren IntegerrmUp
: Rundet generell zum nächstgrößeren IntegerrmTruncate
: Schneidet die Dezimalstellen ab.
Der Unterschied zwischen rmDown
und rmTruncate
zeigt sich bei negativen Zahlen: Mit rmDown
entsteht aus der Zahl -1.25 der Wert -2, während sich mit rmTruncate
der Wert -1 ergibt.
Siehe auch
- Int
- Trunc
- Div
- Änderungen in FPC 2.2.4 Fehlerkorrekur für nicht-x86 und nicht-linux/ppc64 Systeme