2632 Stimmen

Delphi/Lazarus: 3 Wege um eine Zahl auf X Nachkommastellen zu runden

Tutorial von Stefan Trost | Letztes Update am 12.04.2024 | Erstellt am 19.02.2014

Die meisten Nutzer von Delphi oder auch Lazarus denken an die Funktion Round(), wenn es um das Runden einer Zahl geht. Leider kann man diese Funktion aber nicht dazu verwenden, einige Nachkommastellen der Ausgangszahl zu behalten. Denn mit Round() kann man die Zahl 1,2345 nur auf 1 runden, nicht aber auf eine (1,2), zwei (1,23), drei (1,235) oder mehr Nachkommastellen.

Wie genau man dies auch ohne die Standard-Round()-Funktion in Delphi oder Lazarus erreichen kann, möchte ich euch heute in diesem Tutorial zeigen.

Im folgenden schauen wir uns dafür die folgenden drei Möglichkeiten an:

RoundTo

Am einfachsten geht es mit der Funktion RoundTo(), die in der Unit "Math" enthalten ist (ihr müsst also lediglich "Math" zu eurer uses-Section hinzufügen, um diese Funktion nutzen zu können). Hier ist ein Beispiel, wie ihr die Funktion verwenden könnt:

k := 1.2345;
k := RoundTo(k, -2);  // k = 1.23

Als ersten Parameter übergeben wir unsere Zahl, die wir runden möchten, als zweiten Parameter die Anzahl der Nachkommastellen, die wir behalten möchten.

Wichtig: Die Angabe unserer gewünschter Nachkommastellen muss als negativer Wert erfolgen (in unserem Beispiel -2 für zwei Nachkommastellen). Der Hintergrund: Die Funktion RoundTo() nutzt negative versus positive Werte des zweiten Parameters um damit verschiedene Arten der Rundung spezifizieren zu können. Negative Werte werden von der Funktion dazu verwendet, um auf eine Anzahl von Stellen hinter dem Komma zu runden. Positive Werte runden dagegen nicht auf Nachkommastellen sondern auf Stellen vor dem Komma, also zum Beispiel auf Hunderter- oder Tausender-Stellen. Beispiele dafür wären "RoundTo(12345, 2) = 12300" oder "RoundTo(12345, 4) = 10000".

Eigene Funktion

Ältere Versionen der IDE können die RoundTo()-Funktion noch nicht enthalten. Für diesen Fall können wir alternativ auch einfach die folgende Berechnung verwenden, um selber auf unser gerundetes Ergebnis zu kommen:

x := 1.2345;
k := round(x * 100) / 100;    // 1.23
k := round(x * 1000) / 1000;  // 1.235

Verallgemeinert und ausgelagert als Funktion ergibt sich der folgende Code:

function RoundEx(const AInput: extended; APlaces: integer): extended;
var
  k: extended;
begin
  k := power(10, APlaces);
  result := round(AInput * k) / k;
end;

Dieser Funktion müssen wir nur unsere Zahl und die Anzahl der gewünschten Nachkommastellen übergeben und können sie danach genauso verwenden wie RoundTo().

Allerdings mit der Ausnahme, dass diese Funktion im Gegensatz zu RoundTo() nur für Rundungen hinter dem Komma ausgelegt ist. Eine Erweiterung dieser Funktion habe ich daher in diesem Delphi und Lazarus Runden-Tutorial vorgestellt. Mit der dort vorgestellte Funktion kann in beide Richtungen gerundet werden: sowohl auf eine beliebige Anzahl von Nachkommastellen als auch auf beliebige Stellen vor dem Komma. Damit hätten wir einen vollständigen eigenen Ersatz für RoundTo().

Direkte Ausgabe als String

Als dritte Methode zu beliebig gerundeten Zahlen zu gelangen, möchte ich euch nicht vorenthalten, wie ihr eine Kommazahl direkt gerundet als String ausgeben könnt:

x := 1.2345;
s := FormatFloat('0.00', x);           // 1.23
s := FormatFloat('0.000', x);          // 1.235
s := FormatFloat('0.000000', x);       // 1.234500
s := FormatFloat('0.######', x);       // 1.2345
s := FloatToStrF(x, ffFixed, 2, 2);    // 1.23
s := FloatToStrF(x, ffFixed, 3, 3);    // 1.235
s := FloatToStrF(x, ffFixed, 4, 6);    // 1.234500

Wir können dazu zum Beispiel die Funktionen FormatFloat oder FloatToStrF verwenden. Der Code zeigt einige Verwendungsbeispiele beider Funktionen.

FormatFloat übergeben wir als ersten Parameter das Format, als zweiten Parameter die Zahl. Verwenden wir eine "0" im Format, wird diese Stelle auf jeden Fall ausgegeben. Verwenden wir dagegen die Raute "#", wird diese Stelle nur bei Bedarf ausgegeben. Die Beispiele zeigen, wie wir diese Eigenschaften zum runden der übergebenen Zahl nutzen können.

FloatToStrF bietet sehr viele Möglichkeiten, eine Zahl auf verschiedene Weisen zu formatieren. In unserem Fall, also für das Runden, ist es ausreichend, wie in den letzten drei Zeilen des Beispielcodes, als ersten Parameter (Value) die zu rundende Zahl zu übergeben und als letzten die Anzahl der gewünschten Nachkommastellen (Digits). Mit dem zweiten Parameter (Format) kann das Format bestimmt werden, für unsere Zwecke ist hier "ffFixed" (fixed point format) die beste Wahl. Benötigen wir Tausendertrennzeichen, können wir stattdessen alternativ auch "ffNumber" nehmen. Der dritte Parameter (Precision) steht für die Präzision. Wenn die angegebene Precision kleiner gewählt ist als die über den Parameter Digits bestimmte Anzahl von gewünschten Nachkommastellen (wie im letzten Beispiel), werden die zusätzlichen Stellen mit Nullen aufgefüllt.

AntwortenPositivNegativ

Über den Autor

AvatarSoftware von Stefan Trost finden Sie auf sttmedia.de. Benötigen Sie eine individuelle Software nach Ihren eigenen Wünschen? Schreiben Sie uns: sttmedia.de/kontakt
Profil anzeigen

 

Ähnliche Themen

PHP: Zahlen runden

Tutorial | 0 Kommentare

Das sichere Passwort

Info | 0 Kommentare

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.