HOWTO · PowerShell

Cómo redondear números en PowerShell

Este artículo discutirá cómo podemos redondear números en PowerShell utilizando múltiples funciones de la clase Math del framework .NET.

En esta página

PowerShell ofrece varias formas de cambiar la precisión de un número; la opción adecuada depende del resultado que necesites. Usa [Math]::Truncate para eliminar la parte fraccionaria hacia cero, [Math]::Floor o [Math]::Ceiling para redondear en una dirección determinada, y [Math]::Round para redondear al valor más cercano. Para redondear a una cantidad específica de decimales o controlar los empates en los puntos medios, usa la sobrecarga correspondiente de [Math]::Round.

Elige el tipo de redondeo que necesitas

Estas operaciones tienen propósitos distintos. El truncamiento elimina la fracción y avanza hacia cero. Floor avanza hacia el infinito negativo, mientras que ceiling lo hace hacia el infinito positivo. El redondeo al valor más cercano usa [Math]::Round; su regla predeterminada para los puntos medios es redondear al par. Elige la operación antes de dar formato o mostrar un valor, porque el formato cambia cómo se muestra un número, pero no su valor numérico subyacente.

Ejecuta este ejemplo. El código y las salidas visibles se mantienen en inglés:

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

Trunca hacia cero con [Math]::Truncate

[Math]::Truncate descarta la parte fraccionaria y avanza hacia cero. Con una entrada positiva, esto se parece a redondear hacia abajo; con una entrada negativa, avanza hacia arriba en la recta numérica. Por ejemplo, truncar -4.8 da -4, mientras que aplicar floor da -5. Usa el truncamiento cuando quieras eliminar los decimales sin avanzar siempre hacia el infinito negativo.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

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

Redondea hacia abajo con [Math]::Floor y hacia arriba con [Math]::Ceiling

[Math]::Floor devuelve el mayor número entero menor o igual que la entrada, por lo que avanza hacia el infinito negativo. [Math]::Ceiling devuelve el menor número entero mayor o igual que la entrada, por lo que avanza hacia el infinito positivo. La dirección se refiere a la recta numérica, no al tamaño del valor absoluto: con un número negativo, floor puede dar un resultado más negativo y ceiling uno menos negativo.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

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

Redondea a un número entero con [Math]::Round

[Math]::Round(value) devuelve el número entero más cercano. Cuando el valor está exactamente a medio camino entre dos enteros, el comportamiento predeterminado de MidpointRounding es redondear al par: el resultado es el entero par más cercano. Así se evita un sesgo sistemático hacia arriba al redondear repetidamente valores de punto medio. Por eso, los empates 62.5 y 63.5 se resuelven hacia enteros distintos. Esta regla no equivale a redondear siempre los medios hacia arriba.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

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

Redondea a una cantidad determinada de decimales

Usa [Math]::Round(value, digits) para redondear a una cantidad específica de decimales. El argumento digits indica cuántos decimales se solicitan: 0 pide un número entero, 1 un decimal y 2 dos. El resultado sigue siendo un valor numérico; no es una cadena de ancho fijo, así que puede que no aparezcan los ceros finales. Para precios u otros valores con una escala fija, aplica el formato por separado al mostrarlos y usa un tipo numérico y una política de redondeo adecuados para los cálculos.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

$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

Elige explícitamente la regla para los puntos medios

Si la regla predeterminada de redondeo al par no es la que necesitas, pasa un valor de MidpointRounding a [Math]::Round. MidpointRounding.AwayFromZero aleja del cero un punto medio exacto: los empates positivos aumentan y los negativos disminuyen. Selecciona esta regla explícitamente cuando tus requisitos pidan redondear los medios alejándolos de cero. .NET ofrece otras reglas para los puntos medios; comprueba cuál necesitas en vez de suponer que «redondear» siempre significa aplicar una única regla de empate.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

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