Sign in Join
Wiki copytemporary

Round/de: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Rundet eine Fliesskommazahl auf eine Ganzzahl.
22
33# Round
44
55## Deklaration
66
77`function Round(x: Float): Longint;`
88
99## Beispiel
1010
1111### Code
1212
1313``` pascal
1414var
1515 i: Integer;
1616begin
1717 WriteLn( Round(8.7) );
1818 WriteLn( Round(8.3) );
1919 // Beispiele für "Banker-Runden" - .5 wird auf die nächste gerade Zahl eingestellt
2020 WriteLn( Round(2.5) );
2121 WriteLn( Round(3.5) );
2222
2323 i := Round(12.50); // Rundet ab
2424 WriteLn(i);
2525 i := Round(12.51); // Rundet auf
2626 WriteLn(i);
2727end.
2828```
2929
3030### Ausgabe
3131
32-`  9`\
33-`  8`\
34-`  2`\
35-`  4`\
36-` 12`\
37-` 13`
32+```text
33+ 9
34+ 8
35+ 2
36+ 4
37+ 12
38+ 13
39+```
3840
3941## Banker-Runden
4042
4143Die 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.
4244
4345Es 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.
4446
4547### Code:
4648
4749``` pascal
4850var
4951 i: integer;
5052 x: single = 0.5;
5153begin
5254 for i := 0 to 99 do begin
5355 Canvas.Pixels[Round(x), 20]:= clBlack;
5456 WriteLn('Input: ', x: 0: 2, ' round: ', Round(x));
5557 x := x + 1.0;
5658 end;
5759end;
5860```
5961
6062### Ausgabe
6163
62-`  Input: 0.50  round: 0`\
63-`  Input: 1.50  round: 2`\
64-`  Input: 2.50  round: 2`\
65-`  Input: 3.50  round: 4`\
66-`  Input: 4.50  round: 4`\
67-`  ....`
64+```text
65+ Input: 0.50 round: 0
66+ Input: 1.50 round: 2
67+ Input: 2.50 round: 2
68+ Input: 3.50 round: 4
69+ Input: 4.50 round: 4
70+ ....
71+```
6872
6973## Alternativen
7074
7175### trunc(x), ceil(x), floor(x)
7276
7377- [[Trunc|trunc(x)]]: schneidet die Dezimalstellen ab und übergibt die verbleibende ganze Zahl
7478- [[Ceil|ceil(x)]] (unit [[math]]): rundet zur nächstgrößeren ganzen Zahl ("Ceil" = "Ceiling" = "Zimmerdecke" = "nach oben")
7579- [[Floor|floor(x)]] (unit [[math]]): rundet zur nächstkleineren ganzen Zahl ("Floor" = "Fußboden" = "nach unten")
7680
7781**Beispiele** - Man beachte die Unterschiede vor allem bei negativen Zahlen:
7882
7983``` pascal
8084
8185round( 1.8) // -> 2
8286round(-1.8) // -> -2
8387trunc( 1.8) // -> 1
8488trunc(-1.8) // -> -1
8589ceil( 1.8) // -> 2
8690ceil(-1.8) // -> -1
8791floor( 1.8) // -> 1
8892floor(-1.8) // -> -2
8993```
9094
9195**SetRoundMode()**
9296
9397In der Unit [[math]] steht auch die Prozedur [[doc:rtl/math/setroundmode.html|SetRoundMode(ARoundMode)]] zur Verfügung. Der Parameter `ARoundMode = [rmNearest, rmDown, rmUp, rmTruncate]` bestimmt die Art der Rundung.
9498
9599> **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**.
96100
97101### Eigene Rundungs-Routine
98102
99103Diese folgt der üblichen Konvention, dass Zahlen, die exakt zwischen Integern liegen (0.5, 1.5, 2.5 etc), betragsmäßig aufgerundet werden:
100104
101105``` pascal
102106function MyRound(x: Float): Longint;
103107begin
104108 if x > 0 then
105109 Result := trunc(x + 0.5)
106110 else
107111 Result := -trunc(-x + 0.5)
108112end;
109113```
110114
111115## Siehe auch
112116
113117- [[Int]]
114118- [[Trunc]]
115119- [[Div]]
116120- [[User Changes 2.2.4|Änderungen in FPC 2.2.4]] Fehlerkorrekur für nicht-x86 und nicht-linux/ppc64 Systeme
117121
118122---
119123*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](/wiki-contact).*
120124Category: Pascal/de

Back to history