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. |
