37- Redondeo Numérico (Parte II)
Fuente: https://jeffpar.github.io/kbarchive/kb/196/Q196652/
Traducción automática Google Translator
Artículo: Q196652
Producto (s): Microsoft Visual Basic para Windows
Versión (es): 5.0,6.0,6.5,7.0
Palabra clave: kbExcel kbSQLServ KbVBA kbVBp500 kbVBp600 kbGrpDSVBDB kbDSupport kbOffice97
Última modificación: 04-JUN-2001
La información en este artículo se
aplica a:
- Microsoft Visual Basic Control Creation Edition para Windows, versión 5.0
- Microsoft Visual Basic Learning Edition para Windows, versiones 5.0, 6.0
- Microsoft Visual Basic Professional Edition para Windows, versiones 5.0, 6.0
- Microsoft Visual Basic Enterprise Edition para Windows, versiones 5.0, 6.0
- Microsoft SQL Server versiones 6.0, 6.5, 7.0
Resumen:
Hay varios algoritmos de redondeo diferentes disponibles en Microsoft productos.
Los algoritmos de redondeo van desde el redondeo aritmético en Excel
Función de hoja de trabajo Round () para redondeo de banquero en CInt (), CLng () y Funciones Round () en Visual Basic para Aplicaciones.
Este artículo describe qué las diversas
funciones de redondeo de Visual Basic
para Aplicaciones hacen y proporcionan
muestras de uso de las funciones.
Además, el artículo incluye muestra
funciones que implementan varios
algoritmos de redondeo.
Redondeo Explicado
Debe redondear cuando desee convertir
una cantidad de mayor precisión en un
número de menor precisión. El caso más
común es cuando necesita convertir un
número de punto flotante en un entero.
Redondeando Hacia Abajo
La forma más simple de redondeo es el truncamiento. Cualquier dígito después del deseado la precisión simplemente se ignora. La función VBA Fix () es un ejemplo de truncamiento Por ejemplo, Fix (3.5) es 3 y Fix (-3.5) es -3.
La función Int () se redondea al entero más alto menor que el valor. Ambos Int () y Fix () actúan de la misma manera con números positivos, truncando, pero dan diferentes resultados para números negativos: Int (-3.5) da -4.
La función Fix () es un ejemplo de redondeo simétrico porque afecta el magnitud (valor absoluto) de números positivos y negativos de la misma manera. los La función Int () es un ejemplo de redondeo asimétrico porque afecta el magnitud de los números positivos y negativos de manera diferente.
Excel tiene funciones de hoja de cálculo similares: Int (), Floor () y RoundDown (). En t() funciona de la misma manera que Int () en Visual Basic para Aplicaciones. Piso() trunca los valores positivos, pero no funciona con números negativos. los La función RoundDown () funciona de la misma manera que la función VBA Fix ().
Microsoft SQL Server tiene una función Round () que puede actuar como VBA Fix () función. SQL Server también tiene una función Floor (), que funciona de la misma manera que
Función VBA Int ().
Redondeando:
SQL Server y Excel tienen una función llamada Ceiling (), que siempre redondea valores de fracción hacia arriba (más positivos) al siguiente valor.
Visual Basic para aplicaciones no tiene
una función de redondeo correspondiente.
Sin embargo, para números negativos,
tanto Fix () como Int () se pueden usar
para redondear hacia arriba,
En maneras diferentes.
Fix () se redondea hacia 0 (hacia arriba
en sentido absoluto, pero hacia abajo en
términos de absoluto
magnitud). La corrección (-3.5) es -3.5.
Redondeo Aritmético:
Cuando se redondea siempre hacia abajo o hacia arriba, el número resultante no es necesariamente el más cercano al número original. Por ejemplo, si redondea 1.9 a 1, el la diferencia es mucho mayor que si la redondeas a 2. Es fácil ver que los números del 1.6 al 2.4 deben redondearse a 2.
Sin embargo, ¿qué pasa con 1.5, que es equidistante entre 1 y 2? Por convención, el el número a mitad de camino se redondea.
Puede implementar redondear números intermedios de forma simétrica, de modo que -.5 se redondea a -1, o de forma asimétrica, donde -.5 se redondea a 0.
Las siguientes funciones proporcionan redondeo aritmético simétrico:
La función de hoja de cálculo Excel Round ().
La función SQL Server Round () puede realizar redondeos aritméticos simétricos.
La siguiente función proporciona redondeo aritmético asimétrico:
El método Round () de la biblioteca Java Math.
Visual Basic para aplicaciones no tiene
ninguna función aritmética
redondeo
Redondeo del Banquero:
Cuando agrega valores redondeados juntos, siempre redondeando .5 en la misma dirección da como resultado un sesgo que crece con la mayor cantidad de números que sumas. Una manera de minimizar el sesgo es con el redondeo del banquero.
Las vueltas de redondeo del banquero .5
hacia arriba a veces y hacia abajo a
veces. La convención es
redondee al número par más cercano, de
modo que tanto 1.5 como 2.5 redondeen a
2, y 3.5
y 4.5 ambos redondean a 4. El redondeo
del banco es simétrico.
En Visual Basic para aplicaciones, se
realizan las siguientes funciones
numéricas
redondeo del banco: CByte (), CInt (),
CLng (), CCur () y Round ().
Redondeo Aleatorio:
Incluso el redondeo de los banqueros
puede sesgar los totales. Puedes dar un
paso adicional para eliminar el sesgo
redondeando .5 hacia arriba o hacia
abajo de una manera verdaderamente
aleatoria. De esta manera, incluso si
los datos
está sesgado deliberadamente, el sesgo
podría minimizarse. Sin embargo, usando
redondeo aleatorio
con datos distribuidos al azar podría
dar lugar a un sesgo mayor que el de los
banqueros
redondeo El redondeo aleatorio podría
dar como resultado dos totales
diferentes en el mismo
datos.
Ningún producto de Microsoft implementa
ningún tipo de procedimiento de redondeo
aleatorio.
Redondeo Alterno
El redondeo alternativo es el redondeo entre .5 arriba y .5 abajo en llamadas sucesivas. Ningún producto de Microsoft implementa un procedimiento de redondeo alternativo.
La función Round () se implementa inconsistentemente
La función Round () no se implementa de
manera consistente entre diferentes
Productos de Microsoft por razones históricas.
La siguiente tabla relaciona el producto con la implementación:
Implementación de producto
Visual Basic para aplicaciones 6.0
Redondeo bancario
Hoja de cálculo de Excel Redondeo aritmético simétrico
Redondeo aritmético simétrico de SQL Server o redondeado simétrico hacia abajo (Fix) dependiendo de los argumentos
Biblioteca matemática Java Redondeo aritmético asimétrico
La función Round () en Visual Basic 6.0 y Visual Basic para Aplicaciones 6.0 realiza redondeo bancario. Tiene un segundo argumento opcional que especifica el número de dígitos decimales para redondear a:
Debug.Print Round (2.45, 1) devuelve 2.4.
Data de Muestra:
La siguiente tabla muestra algunos datos
de muestra y los efectos de varios
redondeos
métodos sobre los números y totales
generados.
Número / Int. / Fijo / Techo / Asym.
Arith./Sym. Arith./Banker's/Random/Alt.
-2,6 -3 -2 -2 -3 -3-3-3-3
-2.5 -3 -2 -2 -2 -3 -2 -2 -3
-2,4 -3 -2 -2 -2 -2 -2 -2 -2
-1,6 -2 -1 -1 -2 -2 -2 -2 -2 -2
-1.5 -2 -1 -1 -1 -2 -2 -1 -1
-1,4 -2 -1 -1 -1 -1 -1 -1 -1
-0,6 -1 0 0 -1 -1 -1 -1 -1
-0,5 -1 0 0 0 -1 0 -1 -1
-0,4 -1 0 0 0 0 0 0 0
0,4 0 0 1 0 0 0 0 0
0,5 0 0 1 1 1 0 1 1
0.6 0 0 1 1 1 1 1 1
1.4 1 1 2 1 1 1 1 1
1,5 1 1 2 2 2 2 1 1
1,6 1 1 2 2 2 2 2 2
2,4 2 2 3 2 2 2 2 2
2.5 2 2 3 3 3 2 3 3
2,6 2 2 3 3 3 3 3 3
Total de todos los números:
Número / Int. / Fijo / Techo / Asym.
Arith./Sym. Arith./Banker's/Random/Alt.
0,0 -9 0 9 3 0 0 1 0
Total de todos los números negativos:
Número / Int. / Fijo / Techo / Asym.
Arith./Sym. Arith./Banker's/Random/Alt.
-13,5 -18-9-9-12-15-15-13-13-14
Total de todos los números positivos:
Número / Int. / Fijo / Techo / Asym.
Arith./Sym. Arith./Banker's/Random/Alt.
13,5 9 9 18 15 15 13 14 14
El redondeo bancario y el redondeo alterno proporcionan la menor diferencia de totales reales, con redondeo aleatorio no muy lejos.
Sin embargo, si los números son todos positivos o todos negativos, redondeo, redondeo alterno y redondeo aleatorio proporcionan la menor diferencia de los totales reales.
Ejemplo de funciones de redondeo definidas por el usuario:
El código de muestra en la siguiente sección de Listado de funciones proporciona una muestra implementaciones para cada uno de los tipos de redondeo descritos.
Las funciones proporcionadas son:
AsymDown Asimétricamente redondea los
números hacia abajo, similar a Int ().
Los números negativos se vuelven más
negativos.
SymDown Redondea simétricamente los
números hacia abajo, de forma similar a
Fix ().
Trunca todos los números hacia 0.
Igual que AsymDown para números
positivos.
AsymUp Asimetricamente redondea
fracciones de números.
Igual que SymDown para números
negativos.
Similar al techo.
SymUp Redondea simétricamente las
fracciones hacia arriba, es decir, lejos
de 0.
Igual que AsymUp para números positivos.
Igual que AsymDown para números
negativos.
AsymArith Redondeo aritmético
asimétrico: redondea .5 hacia arriba
siempre.
Similar a la hoja de trabajo de Java
Función redonda.
SymArith Redondeo aritmético simétrico:
redondea 0,5 a partir de 0.
Igual que AsymArith para números
positivos.
Similar a la función de Excel Hoja de
cálculo redonda.
Redondeo de BRound Banker.
Redondea .5 hacia arriba o hacia abajo
para lograr un número par.
Simétrico por definición.
RandRound Redondeo aleatorio.
Redondea .5 hacia arriba o hacia abajo
de forma aleatoria.
AltRound Redondeo alterno.
Alterna entre redondear .5 hacia arriba
o hacia abajo.
ATruncDigits Igual que AsyncTrunc pero
toma diferentes argumentos.
Todas estas funciones toman dos
argumentos: el número a redondear y un
factor opcional Si se omite el factor,
las funciones devuelven un número entero
creado por uno de los métodos
anteriores. Si se especifica el factor,
el número es
escalado por el factor para crear
diferentes efectos de redondeo. Por
ejemplo
AsymArith (2.55, 10) produce 2.6, es
decir, se redondea a 1 / factor = 1/10 =
0.1.
NOTA: Un factor de 0 genera un error de
tiempo de ejecución: 1 / factor = 1/0.
La siguiente tabla muestra los efectos
de varios factores:
Comentario de resultado de expresión
AsymArith (2.5) 3 Redondea al siguiente
entero.
BRONDA (2.18, 20) 2.2 Se redondea a los
5 centavos más cercanos (1/20 dólar).
SymDown (25, .1) 20 Redondea a un
múltiplo par de 10.
La excepción a la descripción anterior
es ADownDigits, que es una plantilla
función que le permite especificar el
número de dígitos decimales en lugar de
un
factor.
ADownDigits (2.18, 1) 2.1 Redondea al
siguiente múltiplo de 10 ^ -1.
Listado de Funciones
AsymDown = Int(X * Factor) / Factor
End Function
Function SymDown(ByVal X As Double,
Optional ByVal Factor As Double = 1) As
Double
SymDown = Fix(X * Factor) / Factor
' Alternately:
' SymDown = AsymDown(Abs(X), Factor) *
Sgn(X)
End Function
Function AsymUp(ByVal X As Double,
Optional ByVal Factor As Double = 1) As
Double
Dim Temp As Double
Temp = Int(X * Factor)
AsymUp = (Temp + IIf(X = Temp, 0, 1)) /
Factor
End Function
Function SymUp(ByVal X As Double,
Optional ByVal Factor As Double = 1) As
Double
Dim Temp As Double
Temp = Fix(X * Factor)
SymUp = (Temp + IIf(X = Temp, 0, Sgn(X)))
/ Factor
End Function
Function AsymArith(ByVal X As Double,
Optional ByVal Factor As Double = 1) As
Double
AsymArith = Int(X * Factor + 0.5) /
Factor
End Function
Function SymArith(ByVal X As Double,
Optional ByVal Factor As Double = 1) As
Double
SymArith = Fix(X * Factor + 0.5 * Sgn(X))
/ Factor
' Alternately:
' SymArith = Abs(AsymArith(X, Factor)) *
Sgn(X)
End Function
Function BRound(ByVal X As Double,
Optional ByVal Factor As Double = 1) As
Double
' For smaller numbers:
' BRound = CLng(X * Factor) / Factor
Dim Temp As Double, FixTemp As Double
Temp = X * Factor
FixTemp = Fix(Temp + 0.5 * Sgn(X))
' Handle rounding of .5 in a special
manner
If Temp - Int(Temp) = 0.5 Then
If FixTemp / 2 <> Int(FixTemp / 2) Then
' Is Temp odd
' Reduce Magnitude by 1 to make even
FixTemp = FixTemp - Sgn(X)
End If
End If
BRound = FixTemp / Factor
End Function
Function RandRound(ByVal X As Double,
Optional ByVal Factor As Double = 1) As
Double
' Should Execute Randomize statement
somewhere prior to calling.
Dim Temp As Double, FixTemp As Double
Temp = X * Factor
FixTemp = Fix(Temp + 0.5 * Sgn(X))
' Handle rounding of .5 in a special
manner.
If Temp - Int(Temp) = 0.5 Then
' Reduce Magnitude by 1 in half the
cases.
FixTemp = FixTemp - Int(Rnd * 2) * Sgn(X)
End If
RandRound = FixTemp / Factor
End Function
Function AltRound(ByVal X As Double,
Optional ByVal Factor As Double = 1) As
Double
Static fReduce As Boolean
Dim Temp As Double, FixTemp As Double
Temp = X * Factor
FixTemp = Fix(Temp + 0.5 * Sgn(X))
' Handle rounding of .5 in a special
manner.
If Temp - Int(Temp) = 0.5 Then
' Alternate between rounding .5 down (negative)
and up (positive).
If (fReduce And Sgn(X) = 1) Or (Not
fReduce And Sgn(X) = -1) Then
' Or, replace the previous If statement
with the following to
' alternate between rounding .5 to
reduce magnitude and increase
' magnitude.
' If fReduce Then
FixTemp = FixTemp - Sgn(X)
End If
fReduce = Not fReduce
End If
AltRound = FixTemp / Factor
End Function
Function ADownDigits(ByVal X As Double,
Optional ByVal Digits As Integer = 0) As
Double
ADownDigits = AsymDown(X, 10 ^ Digits)
End Function
Nota:
Con la excepción de la función de hoja de trabajo MRound () de Excel, la función integrada Las funciones de redondeo toman argumentos a la manera de ADownDigits, donde el segundo
El argumento especifica el número de
dígitos en lugar de un factor.
Las implementaciones de redondeo presentadas aquí usan un factor, como MRound (), que es más flexible porque no tienes que redondear a una potencia de 10. Puedes escribir
El contenedor funciona como ADownDigits.
Limitaciones de Coma
Flotante
Todas las implementaciones de redondeo presentadas aquí usan el tipo de datos doble, que puede representar aproximadamente 15 dígitos decimales. Como no todos los valores fraccionales se pueden expresar exactamente, es posible que obtenga resultados inesperados porque el valor de visualización no coincide con el valor almacenado.
Por ejemplo, el número 2.25 podría almacenarse internamente como 2.2499999 ..., que se redondearía hacia abajo con redondeo aritmético, en lugar de hacia arriba como es de esperar.
Además, cuantos más cálculos se realicen, mayor será la posibilidad que el valor binario almacenado se desviará del valor decimal ideal.
Si este es el caso, es posible que desee elegir un tipo de datos diferente, como Moneda, que es exacta a 4 decimales.
También puede considerar hacer que los
tipos de datos sean Variantes y usar
CDec () para convertir
todo al tipo de datos Decimal, que puede
ser exacto a 28 dígitos decimales.
Redondeando Valores de
Moneda
Cuando utiliza el tipo de datos Moneda, que es exactamente de 4 dígitos decimales, usted normalmente quiere redondear a 2 dígitos decimales por centavos.
La función Round2CB a continuación es
una variación codificada que realiza la
función de banquero
redondeando a 2 dígitos decimales, pero
no multiplica el número original. Esta
evita una posible condición de desbordamiento si el monto monetario se acerca al límites del tipo de datos Moneda.
Function Round2CB(ByVal X As Currency)
As Currency
Round2CB = CCur(X / 100) * 100
End Function
Redondeando Valores Decimales
El siguiente es un ejemplo de redondeo
aritmético asimétrico usando el Decimal
tipo de datos:
Function
AsymArithDec(ByVal X As Variant,
Optional ByVal Factor As Variant = 1) As
Variant
If Not IsNumeric(X) Then
AsymArithDec = X
Else
If Not IsNumeric(Factor) Then Factor = 1
AsymArithDec = Int(CDec(X * Factor) +
0.5)
End If
End Function
Dejar caer la precisión como un atajo en el redondeo
Como se enseña en la escuela, el
redondeo es generalmente un redondeo
aritmético usando positivo
números. Con este tipo de redondeo, solo
necesita saber el número de 1 dígito
pasado a donde estás redondeando. Ignora
los dígitos más allá del primer decimal.
En otras palabras, la precisión se
elimina como un atajo para redondear el
valor.
Por ejemplo, tanto 2.5 como 2.51 redondean hacia arriba a 3, mientras que 2.4 y 2.49 redondean hacia abajo a 2. Cuando usa el redondeo de banquero (u otros métodos que redondean .5 hacia arriba o hacia abajo) o cuando redondeas números negativos usando redondeo aritmético asimétrico, la caída de precisión puede conducir a resultados incorrectos en los que no puede redondear a El número más cercano.
Por ejemplo, con el redondeo del banquero, 2.5 vueltas a 2 y 2.51 vueltas a 3) Con redondeo aritmético asimétrico, -2.5 redondea hasta -2 mientras -2.51 redondea hacia abajo a -3.
Las funciones definidas por el usuario presentadas en este artículo toman el número completo precisión en cuenta al realizar el redondeo.
Referencias:
Ayuda de Visual Basic, versión 6.0; tema: Int, funciones de arreglo; Función redonda
Ayuda de Microsoft Transact SQL; tema: Función redonda; Función de piso; Techo
Función
(c) Microsoft Corporation 1998, Todos
los derechos reservados. Contribuciones
de Malcolm
Stewart, Microsoft Corporation.
Palabras de Consulta Adicionales:
Palabras clave: kbExcel kbSQLServ KbVBA
kbVBp500 kbVBp600 kbGrpDSVBDB kbDSupport
kbOffice97
Tecnología: kbVBSearch kbSQLServSearch kbOfficeSearch kbAudDeveloper kbZNotKeyword6 kbSQLServ600 kbSQLServ700 kbSQLServ650 kbZNotKeyword2 kbVB500Search kbVB600Search kbOffice97Search kbVBA600Search kbV
Versión:: 5.0,6.0,6.5,7.0
Tipo de problema: kbhowto
Ir a Redondeo Parte 1