Función de SQL Server para
Aproximar Hacia Arriba con
Cualquier Exactitud
Leonel Morales Díaz
Ingeniería Simple
[email protected]
Copyright 2008 by Leonel Morales Díaz – Ingeniería Simple.
Derechos reservados
Disponible en: http://www.ingenieriasimple.com/TSQL
El problema de aproximar
• “Ya no usamos centavos”
– Guatemala: 1 centavo = US$ 0.0013
– En las cajas no hay centavos
– ¡Pero los precios siguen apareciendo con
centavos!
• Por cálculos de impuestos y márgenes
• Hay que aproximarlos
– La siguiente moneda es de 5 centavos
• Y la siguiente de 10
Requerimientos
• Función flexible
– Hoy es a 5 mañana puede ser a 10 centavos
– Eventualmente podría ser un número raro
• Aproximar a múltiplos de 0.07
– 3.24 => 3.29 (47*0.07)
– 0.13 => 0.14
– 0.15 => 0.21
• Aproximar siempre hacia arriba
– Se garantiza que no habrá pérdida
Round()
• TSQL provee la función Round()
– Round(número,largo)
– Útil pero limitada a múltiplos de 10
Declare @Longi Int
Set @Longi = 7
Select 328.463824915 As Num1,
859.21983475 As Num2,
@Longi As Longi,
Round(328.463824915,@Longi) As Round1,
Round(859.21983475,@Longi) As Round2
Into #RoundResults
While @Longi > -2 Begin
Set @Longi = @Longi - 1
Insert Into #RoundResults
Select 328.463824915 As Num1,
859.2198347531 As Num2,
@Longi As Longi,
Round(328.463824915,@Longi) As Round1,
Round(859.21983475,@Longi) As Round2
End
Num1
-------------328.463824915
328.463824915
328.463824915
328.463824915
328.463824915
328.463824915
328.463824915
328.463824915
328.463824915
328.463824915
Num2
------------859.21983475
859.21983475
859.21983475
859.21983475
859.21983475
859.21983475
859.21983475
859.21983475
859.21983475
859.21983475
(10 row(s) affected)
Select * From #RoundResults Order By Longi DESC
Drop Table #RoundResults
Longi
-----7
6
5
4
3
2
1
0
-1
-2
Round1
-------------328.463824900
328.463825000
328.463820000
328.463800000
328.464000000
328.460000000
328.500000000
328.000000000
330.000000000
300.000000000
Round2
------------859.21983480
859.21983500
859.21983000
859.21980000
859.22000000
859.22000000
859.20000000
859.00000000
860.00000000
900.00000000
Otras funciones TSQL
• Ceiling(Número)
– Aproxima al entero superior más próximo
• Floor(Número)
– Aproxima al entero inferior más próximo
• También útiles para aproximaciones
Solución propuesta
• Función en TSQL
– Recibe un valor Float
• Valor a aproximar
– Otro valor Float
• Valor con un múltiplo al que se debe aproximar el
primer valor
– Siempre aproxima hacia arriba
• Como Ceiling
Definición y uso
Create Function AproximarA
( @Valor Float,
@Aproximar Float )
Returns Float
As Begin
Declare @Resu Float
Set @Resu = Ceiling(@Valor / @Aproximar) * @Aproximar
Return @Resu
END
Declare @Canti Int
Set @Canti = 10
Declare @UnNum Float
Set @UnNum = Rand()*1000
Select @UnNum As Número,
dbo.SI_AproximarA(@UnNum,0.25) As Aprox25,
dbo.SI_AproximarA(@UnNum,0.10) As Aprox10,
dbo.SI_AproximarA(@UnNum,0.05) As Aprox05
Into #AproxResults
While @Canti > 0 Begin
Set @UnNum = Rand()*1000
Insert Into #AproxResults
Select @UnNum As Número,
dbo.SI_AproximarA(@UnNum,0.25) As Aprox25,
dbo.SI_AproximarA(@UnNum,0.10) As Aprox10,
dbo.SI_AproximarA(@UnNum,0.05) As Aprox05
Set @Canti = @Canti - 1
End
Select * From #AproxResults
Drop Table #AproxResults
Número
----------------176.035011794329
1.903078570679
727.345734636078
286.524590463873
659.727039102287
353.695682577216
708.252459976796
736.872683340294
10.2984293377004
310.626434712582
841.835720126952
Aprox25
-------176.25
2
727.5
286.75
659.75
353.75
708.5
737
10.5
310.75
842
(11 row(s) affected)
Aprox10
-------176.1
2
727.4
286.6
659.8
353.7
708.3
736.9
10.3
310.7
841.9
Aprox05
-------176.05
1.95
727.35
286.55
659.75
353.7
708.3
736.9
10.3
310.65
841.85
Descargar

Aproximacion - Ingeniería Simple