HOWTO · PowerShell

Wie man Zahlen in PowerShell rundet

In diesem Artikel wird erörtert, wie wir Zahlen in PowerShell mit mehreren Funktionen der .NET-Framework-Math-Klasse runden können.

Auf dieser Seite

PowerShell bietet mehrere Möglichkeiten, die Genauigkeit einer Zahl anzupassen. Welche Methode passt, hängt vom gewünschten Ergebnis ab: Mit [Math]::Truncate entfernen Sie den Nachkommateil und bewegen sich dabei in Richtung null, mit [Math]::Floor oder [Math]::Ceiling runden Sie gerichtet und mit [Math]::Round auf den nächstgelegenen Wert. Um auf eine bestimmte Anzahl von Dezimalstellen zu runden oder das Verhalten bei genau mittigen Werten festzulegen, verwenden Sie die passende Überladung von [Math]::Round. Auch bei Berechnungen ist die Wahl der passenden Rundungsregel wichtig, damit die Ergebnisse den Anforderungen entsprechen.

Wählen Sie das Rundungsverhalten passend zu Ihrer Aufgabe

Diese Operationen erfüllen unterschiedliche Zwecke. Beim Abschneiden wird der Nachkommateil entfernt und in Richtung null bewegt. Floor bewegt sich in Richtung negativer Unendlichkeit, Ceiling in Richtung positiver Unendlichkeit. Für das Runden auf den nächstgelegenen Wert verwenden Sie [Math]::Round; standardmäßig werden genau mittige Werte zur geraden Zahl gerundet. Legen Sie die Operation fest, bevor Sie einen Wert formatieren oder anzeigen: Die Formatierung ändert die Darstellung einer Zahl, nicht ihren zugrunde liegenden numerischen Wert.

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

$value = 12.34
[Math]::Round($value, 1)
12.3

In Richtung null abschneiden mit [Math]::Truncate

[Math]::Truncate verwirft den Nachkommateil und bewegt sich in Richtung null. Bei einer positiven Eingabe ähnelt das dem Abrunden; bei einer negativen Eingabe bewegt sich das Ergebnis auf der Zahlengeraden jedoch nach oben. So ergibt das Abschneiden von -4.8 den Wert -4, während Abrunden den Wert -5 ergibt. Verwenden Sie das Abschneiden, wenn Sie Nachkommastellen entfernen möchten, ohne stets in Richtung negativer Unendlichkeit zu gehen.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

$positive = [Math]::Truncate(4.8)
$negative = [Math]::Truncate(-4.8)
"$positive, $negative"
4, -4

Mit [Math]::Floor abrunden und mit [Math]::Ceiling aufrunden

[Math]::Floor gibt die größte ganze Zahl zurück, die kleiner oder gleich der Eingabe ist, und bewegt sich somit in Richtung negativer Unendlichkeit. [Math]::Ceiling gibt die kleinste ganze Zahl zurück, die größer oder gleich der Eingabe ist, und bewegt sich damit in Richtung positiver Unendlichkeit. Entscheidend ist die Richtung auf der Zahlengeraden, nicht der Betrag: Bei einer negativen Zahl kann Abrunden ein stärker negatives Ergebnis liefern, während Aufrunden ein weniger negatives Ergebnis ergeben kann.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

$value = -4.2
$down = [Math]::Floor($value)
$up = [Math]::Ceiling($value)
"$down, $up"
-5, -4

Mit [Math]::Round auf eine ganze Zahl runden

[Math]::Round(value) gibt die nächstgelegene ganze Zahl zurück. Liegt der Wert genau zwischen zwei ganzen Zahlen, gilt standardmäßig für MidpointRounding die Regel „zur geraden Zahl“: Das Ergebnis ist die gerade der beiden benachbarten Zahlen. Dadurch wird eine systematische Aufwärtsverzerrung bei wiederholtem Runden mittiger Werte vermieden. Die Werte 62.5 und 63.5 werden deshalb auf unterschiedliche Nachbarzahlen gerundet. Das ist nicht dasselbe wie eine Regel, die jede Hälfte aufrundet.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

$firstTie = [Math]::Round(62.5)
$secondTie = [Math]::Round(63.5)
"$firstTie, $secondTie"
62, 64

Auf eine bestimmte Anzahl von Dezimalstellen runden

Mit [Math]::Round(value, digits) runden Sie auf eine festgelegte Anzahl von Dezimalstellen. Das Argument digits gibt diese Anzahl an: 0 steht für eine ganze Zahl, 1 für eine Dezimalstelle und 2 für zwei. Das Ergebnis bleibt ein numerischer Wert und ist keine Zeichenfolge mit fester Stellenzahl; deshalb werden nachgestellte Nullen möglicherweise nicht angezeigt. Bei Preisen und anderen Werten mit fester Dezimalstellenzahl formatieren Sie das Ergebnis separat für die Anzeige. Verwenden Sie für Berechnungen außerdem einen geeigneten numerischen Datentyp und eine passende Rundungsregel.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

$value = 63.827439
$whole = [Math]::Round($value, 0)
$onePlace = [Math]::Round($value, 1)
$twoPlaces = [Math]::Round($value, 2)
"$whole; $onePlace; $twoPlaces"
64; 63.8; 63.83

Legen Sie das Verhalten bei mittigen Werten ausdrücklich fest

Wenn die standardmäßige Regel „zur geraden Zahl“ nicht zu den Anforderungen passt, übergeben Sie einen MidpointRounding-Wert an [Math]::Round. MidpointRounding.AwayFromZero rundet einen genau mittigen Wert von null weg: Bei positiven Werten steigt das Ergebnis, bei negativen sinkt es. Wählen Sie diese Regel ausdrücklich, wenn Ihre Vorgaben das Runden von Hälften weg von null verlangen. In .NET gibt es weitere Regeln für mittige Werte. Prüfen Sie daher die geforderte Rundungspolitik, statt anzunehmen, dass „Runden“ immer dieselbe Regel für solche Werte meint.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

$positiveTie = [Math]::Round(2.5, [MidpointRounding]::AwayFromZero)
$negativeTie = [Math]::Round(-2.5, [MidpointRounding]::AwayFromZero)
"$positiveTie, $negativeTie"
3, -3