Sign in Join
Wiki copytemporary

Round/de

Deutsch · English · Esperanto · Suomi · Русский

Rundet eine Fliesskommazahl auf eine Ganzzahl.

Round

Deklaration

function Round(x: Float): Longint;

Beispiel

Code

pascal
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, sondern eine gepunktete Linie.

Code:

pascal
var
  i: integer;
  x: single = 0.5;
begin
  for i := 0 to 99 do begin
    Canvas.Pixels[Round(x), 20]:= clBlack;
    WriteLn('Input: ', x: 0: 2, '  round: ', Round(x));
    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

trunc(x), ceil(x), floor(x)

Beispiele - Man beachte die Unterschiede vor allem bei negativen Zahlen:

pascal
  
round( 1.8) // ->  2    
round(-1.8) // -> -2
trunc( 1.8) // ->  1     
trunc(-1.8) // -> -1
ceil( 1.8)  // ->  2     
ceil(-1.8)  // -> -1
floor( 1.8) // ->  1    
floor(-1.8) // -> -2

SetRoundMode()

In der Unit math steht auch die Prozedur SetRoundMode(ARoundMode) zur Verfügung. Der Parameter ARoundMode = [rmNearest, rmDown, rmUp, rmTruncate] bestimmt die Art der Rundung.

Warning: Die Einstellung des RoundMode findet bei allen internen Gleitkomma-Rechnungen Anwendung. Sie bestimmt insbesondere, wie Zahlen, die nicht exakt als Single/Double/Extended-Werte darstellbar sind, im Rahmen der verfügbaren Bits auf die interne Darstellung zu runden sind. Daher wird die Anwendung von SetRoundMode für allgemeine Rundungszwecke nicht empfohlen.

Eigene Rundungs-Routine

Diese folgt der üblichen Konvention, dass Zahlen, die exakt zwischen Integern liegen (0.5, 1.5, 2.5 etc), betragsmäßig aufgerundet werden:

pascal
function MyRound(x: Float): Longint;
begin
  if x > 0 then
    Result := trunc(x + 0.5)
  else
    Result := -trunc(-x + 0.5)
end;

Siehe auch


From the Free Pascal wiki, page "Round/de", as it stood on 2020-04-25 after a change by Kornelius, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 1, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.