HOWTO · PowerShell

Come arrotondare i numeri in PowerShell

Questo articolo discuterà di come possiamo arrotondare i numeri in PowerShell utilizzando più funzioni della classe Math del framework .NET.

In questa pagina

PowerShell offre diversi modi per modificare la precisione di un numero: la scelta giusta dipende dal risultato desiderato. Usa [Math]::Truncate per eliminare la parte frazionaria spostandoti verso zero, [Math]::Floor o [Math]::Ceiling per arrotondare in una direzione specifica e [Math]::Round per arrotondare al valore più vicino. Per arrotondare a un numero specifico di cifre decimali o controllare i casi a metà, usa l’overload appropriato di [Math]::Round.

Scegli il comportamento di arrotondamento adatto al tuo caso

Queste operazioni hanno scopi diversi. Il troncamento elimina la parte frazionaria e si sposta verso zero. Il floor si sposta verso meno infinito, mentre il ceiling si sposta verso più infinito. Per arrotondare al valore più vicino si usa [Math]::Round; la regola predefinita per i casi a metà è l’arrotondamento al pari. Scegli l’operazione prima di formattare o visualizzare un valore, perché la formattazione ne cambia la rappresentazione, ma non il valore numerico sottostante.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

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

Troncare verso zero con [Math]::Truncate

[Math]::Truncate elimina la parte frazionaria e si sposta verso zero. Con un valore positivo, il risultato è simile a un arrotondamento per difetto; con un valore negativo, invece, si sposta verso l’alto sulla linea dei numeri. Per esempio, troncando -4.8 si ottiene -4, mentre con il floor si ottiene -5. Usa il troncamento quando vuoi eliminare le cifre frazionarie senza spostarti sempre verso meno infinito.

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

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

Arrotondare per difetto con [Math]::Floor e per eccesso con [Math]::Ceiling

[Math]::Floor restituisce il numero intero più grande minore o uguale all’input, quindi si sposta verso meno infinito. [Math]::Ceiling restituisce il numero intero più piccolo maggiore o uguale all’input, quindi si sposta verso più infinito. La direzione si riferisce alla linea dei numeri, non al valore assoluto: con un numero negativo, il floor può dare un risultato più negativo, mentre il ceiling può darne uno meno negativo.

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

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

Arrotondare a un numero intero con [Math]::Round

[Math]::Round(value) restituisce il numero intero più vicino. Quando il valore è esattamente a metà tra due interi, la regola predefinita di MidpointRounding è l’arrotondamento al pari: il risultato è l’intero pari tra i due. In questo modo si evita una tendenza sistematica ad arrotondare per eccesso quando si arrotondano ripetutamente valori a metà. Perciò i casi 62.5 e 63.5 vengono arrotondati a interi diversi. Questa regola non equivale ad arrotondare sempre per eccesso i valori che terminano in metà.

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

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

Arrotondare a un numero specifico di cifre decimali

Usa [Math]::Round(value, digits) per arrotondare a un numero specifico di cifre decimali. L’argomento digits indica quante cifre decimali considerare: 0 richiede un numero intero, 1 una cifra decimale e 2 due. Il risultato resta un valore numerico, non una stringa visualizzata con un numero fisso di cifre; perciò gli zeri finali potrebbero non comparire. Per i prezzi o altri valori con un numero fisso di cifre decimali, formatta separatamente il risultato da visualizzare e scegli un tipo numerico e una regola di arrotondamento adatti ai calcoli.

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

$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

Scegli esplicitamente la regola per i casi a metà

Quando la regola predefinita di arrotondamento al pari non corrisponde a quella richiesta, passa un valore MidpointRounding a [Math]::Round. MidpointRounding.AwayFromZero allontana da zero un valore esattamente a metà: i casi positivi aumentano e quelli negativi diminuiscono. Se i requisiti prevedono l’arrotondamento della metà lontano da zero, seleziona esplicitamente questa regola. In .NET sono disponibili anche altre regole per i casi a metà: verifica quale serve, invece di presumere che «arrotondare» indichi sempre un’unica regola.

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

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