Comparativa distintas versiones access

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.  Int () se redondea desde 0 (hacia arriba en términos de magnitud absoluta, pero hacia abajo en el sentido absoluto). Int (-3.5) es -4.


 

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 (). No hay funciones de hoja de cálculo de Excel que realicen el redondeo bancario.


 

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

 La tabla muestra la diferencia entre los diversos métodos de redondeo. Para al azar números positivos y negativos distribuidos, Fix (), redondeo aritmético simétrico,

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   

Function AsymDown(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double
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

 

 

[Atrás]