Función ASP para redondear por alto números reales

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

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.

Compartir

Comentarios

Pablo Bretado

29/6/2010
Agradecimiento
Gracias por el aporte Camarada (y)

George

11/3/2011
gracias
Gracias por el aporte genio!...me salvaste de una!

eduardo

16/8/2011
Solucion
yo tenia el mismo problema pero al revez keria redodndear
hacia abajo pero yo utilizaba el formatnumber()
y leyendo tu articulo me di cuenta que uno redondea hacia abajo round()
y el formatnumber() hacia arriba

saludos gracias

Daniela

13/10/2011
Muchisimas gracias ¡!!
esta funcion funciona joya y es justo lo que necesitaba. Estaba buscando una funcion para vb 6 que fuera equivalente a la funcion ceiling y esta vino como anillo al dedo, gracias ¡!!!