Redondeo de números y aritmética con PowerShell

Según Wikipedia:

La arítmetica es la rama de la matemática cuyo objeto de estudio son los números y las operaciones elementales hechas con ellos: adición, resta, multiplicación y división.

Así es que lo que vamos a comprobar hoy es la facilidad con la que podemos realizar operaciones desde PowerShell para intentar hacer un mundo mejor (o al menos, más automatizado) dentro de la mátemática!

PowerShell ofrece de forma implícita la utilización de las operaciones elementales como se expresa en la definición de aritmética. Simplemente hay que ejecutar la operación a realizar como lo haríamos en la calculadora de Windows:

#sumar
8+5
#restar
12-8
#multiplicar
4*3
#dividir
150/5

Y los resultados serían los siguientes:

Aritmetica con PowerShell

Podemos armar algo más avanzado como se expresa a continuación:

# muiltiplicación
3 * (4 + 5)
#división
10 / (2 + 3)

Aritmética con PowerShell

Logrando una hazaña inimaginable: Llegar a los límites del lenguaje! Bah, eso sería una realidad si no consideramos la facilidad que tiene PowerShell para poder expandir los operadores matemáticos que trae incorporados por defecto. Aunque parezca extraño, no se han añadido cálculos complejos en el lenguaje, pero podemos vivir tranquilos ya que siempre tenemos a mano .Net de forma casi nativa dentro de PowerShell.

Matemática con PowerShell

Es por lo anterior que vamos a ver una System class llamada [Math] que contiene unos 30 métodos para poder hacer matemática con ellos!

[Math] es una clase estática, lo que significa que no se puede crear un objeto [math]. Es una colección de métodos (fragmentos de código que podemos aprovechar en nuestros scripts) que han sido ubicados en nuestro camino para poder aprovecharlos.

En consecuencia a lo ya comentado, para poder observar que nos permite hacer esta clase (o al menos, que nos ofrece a nivel de métodos), debemos ejecutar la siguiente línea:

[math].GetMethods()

[Math].GetMethods()

Y si el resultado es demasiada información para ubicarnos a leer cada línea sin perder medio día de nuestras vidas, lo mejor es filtrar por nombre:

[math].GetMethods() | select name -Unique

[math].GetMethods() | select name -Unique

Con el resultado de lo anterior podemos observar que existen algunas palabras que nos suenan familiar… Así que vamos a detallar el método que nos permite redondear nuestros números en la consola para poder sacarle fruto a nuestros scripts.

Para poder invocar un método en la sentencia a ejecutar, es necesario usar el nombre de la clase y el nombre del método separados por dos puntos dobles (::).

Redondeo de números con el método ::round()

Como se ha indicado en el título de la sección, el método ::round() nos permite redondear números decimales definiendo la cantidad de cifras posteriores al punto que deseamos mantener:

[math]::round(123.4567)

El resultado de lo anterior es 123 ya que en el ejemplo anterior no se ha utilizado el parámetro adicional que permite seleccionar cuantos decimales se desean mantener. Es decir si tengo el mismo número anterior (123.4567) y pretendo redondear con 2 decimales, debo ejecutar:

[math]::round(123.4567,2)

Obteniendo el número 123.46 como resultado de lo ejecutado. Veamos algunos ejemplos adicionales para entender mejor su uso:

Ejemplos de usos del método ::round()

A modo de conclusión vimos que al intentar ejecutar el método con un valor para la cantidad de decilames negativo se produce un error.

Como dato adicional se recomienda usar el tipo de conversión dinámica que ofrece PowerShell al intentar redondear en naturales, de la siguiente manera:

#redondear sin los decimales
[int]123.456
#más recomendado que usar [math]::round(123.456)

Método adicional

A su vez existe un parámetro adicional que puede ser utilizado dentro del método ::round() y es un tipo de redondeo llamado “Away from zero”. Consiste en agregar el tipo de enumeración [system.midpointrounding] como tercer parámetro de la siguiente forma:

[math]::round(123.456,2,[system.midpointrounding]::AwayFromZero)

Obteniendo como resultado: 123.46.

Existen otras maneras más practicas de declarar lo anterior (ya que recordar toda esa cadena de caracteres es un poco complejo):

[math]::round(123.456,2,[midpointrounding]::AwayFromZero)
[math]::round(123.456,2,"AwayFromZero")
[math]::round(123.456,2,1)

Ejemplos de uso del tipo de redondeo Away from zero

En el ejemplo se muestra con amarillo que siempre se usó el mismo número decimal y que los resultados cambian dependiendo de los parámetros que se utilizan: con Rojo se resalta el resultado de redondear como veníamos trabajando y con Verde se resaltan los resultados de utilizar el tipo de redondeo “Away from zero”.

Para obtener un mayor detalle de los métodos que ofrece la clase Math, adjunto el enlace de la documentación oficial que hace referencia a los diferentes métodos existentes en mayor profundidad:

Math Methods

Espero que sea de ayuda.

Saludos,

Comments