Una función en ASP para redondear números reales, con decimales, pero siempre haciendo el redondeo hacia arriba.
Necesitaba esta función para calcular el IVA en una aplicación de facturación. Como el IVA siempre se redondea hacia arriba, no me valía la función round() que viene en Visual Basic Script de ASP. Bueno, me valía, pero tenía que hacer luego unos ajustes para asegurarme que el redondeo lo hacía por alto.
Como estoy trabajando con Euros, tengo que utilizar siempre dos decimales, aunque he parametrizado los decimales que queremos redondear para que esta función de redondeo por alto siempre funcione para lo que se llaman en matemáticas números reales, sean cuales sean los números en coma flotante (decimales) que tengamos.
Así, esta función tiene dos parámetros siempre. El primero es el número a redondear y el segundo el número de decimales que queremos. Por ejemplo, voy a poner ahora varios valores a redondear por arriba para que se entienda lo que estoy diciendo:
Valor 3 (decimales 0) - Resultado: 3
Valor 3,5 (decimales 0) - Resultado: 4
Valor 3,59 (decimales 1) - Resultado: 3,6
Valor 3,55045 (decimales: 2) - Resultado: 3,56
El código de la función es el siguiente. Viene comentado para entenderse mejor.
'funcion que redondea por arriba
function redondear_arriba(valor,decimales)
'response.write "<p>Valor: " & valor
'response.write "<br>decimales: " & decimales
if (decimales = 0) then
'es que no se desean decimales, puedo devolver la parte entera
'pero si el número tiene decimales, tengo que redondear por arriba
if (int(valor)-valor < 0) then
'es que había decimales en el valor, devuelvo el valor entero + 1
redondear_arriba = int(valor) + 1
else
'es que no había decimales
redondear_arriba = valor
end if
else
'es que nos han dado un valor de decimales y hay que redondear con esos decimales
redondeo = round(valor, decimales)
'si el redondeo es por bajo lo hago por arriba
if (valor - redondeo) > 0 then
redondeo = redondeo + (1/(calcula_base_exponente(10,decimales)))
redondeo = round (redondeo,decimales)
end if
redondear_arriba=redondeo
end if
end function
La función parece larga, porque tiene mucho comentario y algún response.write para mostrar el estado de las variables. Pero en realidad es simple.
Tiene dos partes, una para el redondeo de números sin decimales y otra para el redondeo cuando se desean decimales. Cuando no se quieren usar decimales simplemente devuelvo la parte entera y veo si el número original tenía decimales, porque entonces hay que redondear hacia arriba, sumando 1 a la parte entera.
Cuando se pide redondeo con un número de decimales mayor que cero, se utiliza la función round() que viene de salida con ASP y Visual Basic Script.
Referencia: tenemos una explicación sobre la función round() y la función int() que utilizamos en el código anterior en el artículo redondear decimales en ASP
Luego hago un cálculo para saber si el valor redondeado fue hecho por abajo, porque entonces tiene que ser por arriba. Para ello hago una operación de sumar al número redondeado un valor decimal. Si nos pidieron redondeo de 1 decimal, le sumo una décima, si nos pidieron número con dos decimales, le sumo una centésima, si fueron 3 decimales los solicitados, sumo una milésima y así.
Espero que se entienda y sirva de algo para los lectores.
Como estoy trabajando con Euros, tengo que utilizar siempre dos decimales, aunque he parametrizado los decimales que queremos redondear para que esta función de redondeo por alto siempre funcione para lo que se llaman en matemáticas números reales, sean cuales sean los números en coma flotante (decimales) que tengamos.
Así, esta función tiene dos parámetros siempre. El primero es el número a redondear y el segundo el número de decimales que queremos. Por ejemplo, voy a poner ahora varios valores a redondear por arriba para que se entienda lo que estoy diciendo:
Valor 3 (decimales 0) - Resultado: 3
Valor 3,5 (decimales 0) - Resultado: 4
Valor 3,59 (decimales 1) - Resultado: 3,6
Valor 3,55045 (decimales: 2) - Resultado: 3,56
El código de la función es el siguiente. Viene comentado para entenderse mejor.
'funcion que redondea por arriba
function redondear_arriba(valor,decimales)
'response.write "<p>Valor: " & valor
'response.write "<br>decimales: " & decimales
if (decimales = 0) then
'es que no se desean decimales, puedo devolver la parte entera
'pero si el número tiene decimales, tengo que redondear por arriba
if (int(valor)-valor < 0) then
'es que había decimales en el valor, devuelvo el valor entero + 1
redondear_arriba = int(valor) + 1
else
'es que no había decimales
redondear_arriba = valor
end if
else
'es que nos han dado un valor de decimales y hay que redondear con esos decimales
redondeo = round(valor, decimales)
'si el redondeo es por bajo lo hago por arriba
if (valor - redondeo) > 0 then
redondeo = redondeo + (1/(calcula_base_exponente(10,decimales)))
redondeo = round (redondeo,decimales)
end if
redondear_arriba=redondeo
end if
end function
La función parece larga, porque tiene mucho comentario y algún response.write para mostrar el estado de las variables. Pero en realidad es simple.
Tiene dos partes, una para el redondeo de números sin decimales y otra para el redondeo cuando se desean decimales. Cuando no se quieren usar decimales simplemente devuelvo la parte entera y veo si el número original tenía decimales, porque entonces hay que redondear hacia arriba, sumando 1 a la parte entera.
Cuando se pide redondeo con un número de decimales mayor que cero, se utiliza la función round() que viene de salida con ASP y Visual Basic Script.
Referencia: tenemos una explicación sobre la función round() y la función int() que utilizamos en el código anterior en el artículo redondear decimales en ASP
Referencia: tenemos una explicación sobre la función round() y la función int() que utilizamos en el código anterior en el artículo redondear decimales en ASP |
Luego hago un cálculo para saber si el valor redondeado fue hecho por abajo, porque entonces tiene que ser por arriba. Para ello hago una operación de sumar al número redondeado un valor decimal. Si nos pidieron redondeo de 1 decimal, le sumo una décima, si nos pidieron número con dos decimales, le sumo una centésima, si fueron 3 decimales los solicitados, sumo una milésima y así.
Espero que se entienda y sirva de algo para los lectores.
Luis Javier Alvarez