Dolor de cabeza: redondeando en ASP

Aquellos que hayáis programado en cualquier lenguaje medianamente aceptable,
habrá podido apreciar que las funciones matemáticas math.floor y math.ceil o
math.ceiling nos proporcionan métodos para redondear hacia abajo o hacia
arriba, cosa que para algunos casos es vital.
Pues bien, ASP ni lo huele.
No obstante, siempre podemos crearnos unos métodos ingeniosos para conseguir casi los mismos
resultados.

He creado 2 funciones que podemos llamar según queramos redondear hacia arriba
o hacia abajo, llamadas roundDown y roundUp, y después una función con piloto
automático y que decidirá si usar uno u otro método dependiendo de su decimal:
autoRound.

La gran pregunta aquí es qué pasa si le paso 10,5, pues según ocurre por ejemplo en
.NET se redondea hacia abajo, pero si está por encima, p.e., 10,51 se redondea hacia
arriba.
En un principio me plantee que examinaría el 2 decimal y si éste era mayor de 0 redondearía
hacia arriba, pero que pasa si el número fuera 10,501. Con este método hubiera
redondeado hacia abajo, y shlaf!! gran error, gran horror.
Es por eso que en autoRound empleo un loop que me indicará si uno de los decimales
a partir del segundo decimal es mayor de 0 pues se redondeará hacia arriba.

Esta función también lo toma en cuenta:


Function roundDown(dblValue)
Dim myDec

myDec = InStr(1, CStr(dblValue), ",")
If myDec > 0 Then
    roundDown = CDbl(Left(CStr(dblValue), myDec))
Else
    roundDown = dblValue
End If

End Function

Function roundUp(dblValue)
Dim myDec

myDec = InStr(1, CStr(dblValue), ",")
If myDec > 0 Then
    roundUp = CDbl(Left(CStr(dblValue), myDec)) + 1
Else
    roundUp = dblValue
End If

End Function

function autoRound(dblValue)
Dim myDec,pos,ini,aux

ini=1
pos = InStr(1, CStr(dblValue), ",")
myDec=left(mid(cstr(dblValue),pos+ini),1)
aux=false

If myDec > 5 Then
        autoRound = roundUp(dblValue)
       
    Else
   
    if myDec = 5 then   
   
            do while Len(myDec)>0 and aux=false and ini<100
                ini=ini+1
                myDec=left(mid(cstr(dblValue),pos+ini),1)       
                if not isNumeric(myDec) then myDec=0       
                if myDec>0 then               
                     aux=true
                end if
               
            loop
       
            if aux=true then
       
                 autoRound = roundUp(dblValue)
       
            else
       
                autoRound = roundDown(dblValue)
               
            end if
       
    else
   
            autoRound = roundDown(dblValue)
   
    end if
   
end if


end function

Response.Write "<br>"
Response.Write "10,66: " & autoRound("10,66") & "<br>"'El output será 11.
Response.Write "10,1: " &autoRound("10,1") & "<br>"'El output será 10.
Response.Write "10,55: " &autoRound("10,55") & "<br>"'El output será 11.
Response.Write "10,5555: " &autoRound("10,5555") & "<br>"'El output será 11.
Response.Write "10,5: " &autoRound("10,5") & "<br>"'El output será 10.
Response.Write "10,51: " &autoRound("10,51") & "<br>"'El output será 10.
Response.Write "10,501: " &autoRound("10,501") & " Este estaría mal si no hiciéramos el loop<br>"'El output será 10.
Response.Write "10,5001: " &autoRound("10,5001") & " Este estaría mal si no hiciéramos el loop<br>"'El output será 10.
Response.Write "10,5000: " &autoRound("10,5000") & " Este estaría mal si no hiciéramos el loop<br>"'El output será 10.
Response.Write "10: " &autoRound("10") & "<br>"'El output será 10.