Sign in Join
Wiki copytemporary

Round/de: what changed

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

Title: Round/de

OldNewLine
1+Rundet eine Fliesskommazahl auf eine Ganzzahl.
2+
3+# Round
4+
5+## Deklaration
6+
7+`function Round(x: Float): Longint;`
8+
9+## Beispiel
10+
11+### Code
12+
13+``` pascal
14+var
15+ i: Integer;
16+begin
17+ WriteLn( Round(8.7) );
18+ WriteLn( Round(8.3) );
19+ // Beispiele für "Banker-Runden" - .5 wird auf die nächste gerade Zahl eingestellt
20+ WriteLn( Round(2.5) );
21+ WriteLn( Round(3.5) );
22+
23+ i := Round(12.50); // Rundet ab
24+ WriteLn(i);
25+ i := Round(12.51); // Rundet auf
26+ WriteLn(i);
27+end.
28+```
29+
30+### Ausgabe
31+
32+`  9`\
33+`  8`\
34+`  2`\
35+`  4`\
36+` 12`\
37+` 13`
38+
39+## Banker-Runden
40+
41+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.
42+
43+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.
44+
45+### Code:
46+
47+``` pascal
48+var
49+ i: integer;
50+ x: single = 0.5;
51+begin
52+ for i := 0 to 99 do begin
53+ Canvas.Pixels[Round(x), 20]:= clBlack;
54+ WriteLn('Input: ', x: 0: 2, ' round: ', Round(x));
55+ x := x + 1.0;
56+ end;
57+end;
58+```
59+
60+### Ausgabe
61+
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+`  ....`
68+
69+## Alternativen
70+
71+### trunc(x), ceil(x), floor(x)
72+
73+- [[Trunc|trunc(x)]]: schneidet die Dezimalstellen ab und übergibt die verbleibende ganze Zahl
74+- [[Ceil|ceil(x)]] (unit [[math]]): rundet zur nächstgrößeren ganzen Zahl ("Ceil" = "Ceiling" = "Zimmerdecke" = "nach oben")
75+- [[Floor|floor(x)]] (unit [[math]]): rundet zur nächstkleineren ganzen Zahl ("Floor" = "Fußboden" = "nach unten")
76+
77+**Beispiele** - Man beachte die Unterschiede vor allem bei negativen Zahlen:
78+
79+``` pascal
80+
81+round( 1.8) // -> 2
82+round(-1.8) // -> -2
83+trunc( 1.8) // -> 1
84+trunc(-1.8) // -> -1
85+ceil( 1.8) // -> 2
86+ceil(-1.8) // -> -1
87+floor( 1.8) // -> 1
88+floor(-1.8) // -> -2
89+```
90+
91+**SetRoundMode()**
92+
93+In 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.
94+
95+> **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**.
96+
97+### Eigene Rundungs-Routine
98+
99+Diese folgt der üblichen Konvention, dass Zahlen, die exakt zwischen Integern liegen (0.5, 1.5, 2.5 etc), betragsmäßig aufgerundet werden:
100+
101+``` pascal
102+function MyRound(x: Float): Longint;
103+begin
104+ if x > 0 then
105+ Result := trunc(x + 0.5)
106+ else
107+ Result := -trunc(-x + 0.5)
108+end;
109+```
110+
111+## Siehe auch
112+
113+- [[Int]]
114+- [[Trunc]]
115+- [[Div]]
116+- [[User Changes 2.2.4|Änderungen in FPC 2.2.4]] Fehlerkorrekur für nicht-x86 und nicht-linux/ppc64 Systeme
117+
118+---
119+*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).*
120+Category: Pascal/de

Back to history