Comparativa distintas versiones access

36- Redondeo Numérico (Parte I)

 

Fuente: https://answers.microsoft.com/es-es/msoffice/forum/all/redondeo/df0d58ff-11d6-40db-9137-a4ea0ea3fe73

 

Resumen

Nivel técnico: Intermedio Se aplica a: cualquier versión de Office. Pretende explicar algo aparentemente sencillo pero que tiene su complicación: el redondeo de cantidades numéricas.

 

¿Qué es el redondeo?

Según la Real Academia Española, redondear una cantidad es prescindir de pequeñas diferencias en más o en menos, para tener en cuenta solamente unidades de orden superior.

Por ejemplo, en el sistema decimal, redondeamos a unidades, a decenas, a centenas, o a décimas, centésimas, milésimas,…

Con el redondeo o se pierde precisión (por ejemplo, una medida con precisión de centímetros, 1,03 m., redondeada a 1 m.) o se pretende expresar la precisión del dato (si medimos una distancia y la precisión de las medidas o de los cálculos establecen una precisión de centenas tenemos que redondear a las centenas, o, si en un cálculo con la unidad monetaria euro, una operación matemática produce un resultado con más de dos decimales, obligatoriamente tendremos que redondear a dos decimales, pues la moneda más pequeña es el céntimo). Esto es importante: cuando redondeamos 1,03 no debemos redondear a 1,00, sino a 1,0 o a 1, pues las cifras decimales indican la precisión de la medida (no es lo mismo decir que algo mide 1,00 m., que 1,0 m., que 1 m.; la primera de las medidas tiene precisión de centímetros, las otras no).

 

¿Por qué redondeamos?

El redondeo se hace por conveniencia o por necesidad.

Se redondea por conveniencia cuando no necesitamos mucha precisión en los cálculos (trabajar con números redondeados es menos costoso en tiempo y facilidad de cálculo) o en el valor del dato (un número redondeado es más claro y fácil de recordar) o para indicar la precisión de un dato (no tiene sentido hacer una estimación del número de asistentes a un acto multitudinario y decir que había 123.456 personas, en función de la precisión de la estimación diríamos 100.000 o 120.000).

Se redondea por necesidad cuando trabajamos con un número irracional o periódico (estos números tienen infinitas cifras) o cuando tenemos limitado el número de cifras con las que podemos trabajar (es el caso de las operaciones que se hacen en una calculadora u ordenador, o el caso de la notación interna de los números en punto flotante) o cuando el número de cifras nos lo impone la unidad de medida (cuando trabajamos con cifras de dinero en euros, no podemos dar una cifra inferior al céntimo, pues es la moneda más pequeña que existe).

 

Métodos de redondeo:

No existe una única manera de redondear un número y a un entero que, en consecuencia, el redondeo dependerá de cómo definamos la operación de redondeo.

Redondeo acercándose a -¥  (Round Down)

que es el primer entero que nos encontramos, recorriendo la recta de los números reales en sentido hacia -¥, partiendo de y. Dicho de otro modo, que es el mayor entero  que no excede y.

 La función ENTERO de Excel utiliza este método de redondeo, así como la función personalizada AsymDown. La función Floor de Excel no funciona de acuerdo con la definición matemática de la función suelo (Floor).

 

 Tabla 1 Redondeo

 

Números que son iguales en valor absoluto, no son redondeados de igual modo, a esto se le dice comportamiento asimétrico.

Redondeo acercándose a +¥  (Round Up)

que es primer entero que nos encontramos, recorriendo la recta de los números reales, en sentido hacia +¥, partiendo de y. Dicho de otro modo, que es el menor entero que no es menor que y.

No existe ninguna función Excel que haga este redondeo. La función Ceiling de Excel no funciona de acuerdo con la definición matemática de la función techo (ceil).

 

Tabla 2 Redondeo

 

Números que son iguales en valor absoluto, no son redondeados de igual modo, a esto se le dice comportamiento asimétrico.

Redondeo acercándose a cero (Round Towards Zero)

que es el primer entero que nos encontramos, partiendo de y, recorriendo la recta de los números reales, en sentido hacia 0. Dicho de otro modo, que es la parte entera de y, sin sus dígitos fraccionarios.

Este método es el que utilizamos cuando truncamos un número (nos quedamos sólo con la parte entera).

La función TRUNCAR de Excel, la función Floor de VBA Excel y las funciones personalizadas RoundDown y SymDown, utiliza este método de redondeo.

Tabla 3 Redondeo

 

Números que son iguales en valor absoluto, también son iguales en valor absoluto una vez redondeados. Comportamiento simétrico.

Redondeo alejándose de cero (Round Away From Zero)

que es el primer entero que nos encontramos, partiendo de y, recorriendo la recta de los números reales, alejándonos del 0. Dicho de otro modo, si y es un entero, que es y, en caso contrario que es el entero más cercano a 0 y tal que y esté entre 0 y que.

La función REDONDEAR.MAS de Excel, la función Ceiling de VBA Excel y las funciones personalizadas RoundUp y SymUp, utilizan este redondeo.

Tabla 4 Redondear

 

Números que son iguales en valor absoluto, también son iguales en valor absoluto una vez redondeados. Comportamiento simétrico.

Redondeo al más cercano (Round To Nearest) que es el entero más cercano a y.

En este método se plantea el dilema de cómo redondear un número que está, exactamente, a medio camino de dos números enteros (es el caso del número 23,50, está a la misma distancia de 23 que de 24). Para resolver este dilema se utilizan distintas reglas de desempate.

Desempate la mitad hacia arriba (Round Half Up)

La regla de desempate, redondear la mitad hacia arriba (Round Half Up), o redondear la mitad hacia más infinito (Round Half Towards Plus Infinity), se usa ampliamente en muchas disciplinas y consiste en que, cuando y está a mitad de camino, se redondea hacia arriba.

No existe ninguna función Excel que haga este redondeo, sólo la función personalizada AsymArith lo hace.

Tabla 5 Redondeo

 

Los números que son iguales en valor absoluto también son iguales en valor absoluto una vez redondeados, excepto los que están a medio camino.

Ahora supongamos que tenemos que sumar una relación suficientemente larga de números aleatorios, si hay números positivos y negativos, la suma de estos números redondeados, tenderá a ser igual a la suma de los números originales (sin redondear), porque los redondeos se compensarán, pero, si la relación la forman números mayoritariamente positivos, como la fracción 0,5 siempre se redondea hacia arriba, la suma tenderá a ser mayor que la de los números originales (por exceso o con sesgo positivo). En sentido contrario si la relación es de números mayoritariamente negativos.

Este error de redondeo, en determinados casos iterativos y si no se utiliza adecuadamente la función de redondeo, puede llegar a ser inaceptable. Por ejemplo: cuando se creó la Bolsa de Vancouver (Vancouver Stock Exchange) en 1982, iniciaron el índice a 1.000,000 (tres cifras decimales), y después de 22 meses, el índice había caído a cerca de 520 mientras los precios de las acciones se habían incrementado en el mismo periodo. El problema se debió a que el índice se recalculaba miles de veces al día, y siempre se redondeaba a 3 decimales, de tal manera que los errores de redondeo se acumulaban. Recalculando con mejores métodos el valor del índice, para el mismo periodo, fue 1.098,892.

 

Otro ejemplo:

2,00 + 0,555 = 2,56

2,56 – 0,555 = 2,01

2,01 + 0,555 = 2,57

2,57 – 0,555 = 2,02

 

Vemos que el resultado, después de sumar y restar la misma cantidad, no es el de partida y si repetimos el proceso el error se incrementará sin límite. En este caso, lo correcto es no redondear después de cada suma, sino al final del proceso.

Desempate la mitad hacia abajo (Round Half Down)

No existe ninguna función de Excel que realice este redondeo.

 

 Tabla 6 Redondeo

 

Por ejemplo, 23,5 se redondea a 23, y −23.5 se redondea a −24.

Es de aplicación lo dicho en el caso anterior mutatis mutandi.

Desempate la mitad alejándose del cero (Round Half Away From Zero o Round Half Towards Infinity)

Cuando damos formato de decimales a un número en Excel, las funciones de Excel REDONDEAR y REDOND.MULT, la función Round de VBA Excel, y las funciones personalizadas MRound y SymArith, realizan este redondeo.

 

 

Este método trata los valores positivos y negativos simétricamente y por lo tanto no habrá sesgo (por mejor decir, la tendencia es a que no haya sesgo) si los números positivos y negativos están equilibrados, pero en el caso de que predominen unos u otros, el sesgo existirá (si predominan los positivos el sesgo será por exceso y si predominan los negativos el sesgo será por defecto).

Esta regla se utiliza habitualmente para conversiones de números y redondeo de precios (esto garantiza el mismo trato para los pagos y para los cobros).

Desempate la mitad hacia el cero (Round Half Towards Zero o Round Half Away From Infinity)

No existe ninguna función Excel que realice este redondeo.

 

 

Este método es similar al anterior y lo dicho es de aplicación mutatis mutandi.

Desempate la mitad al par (Round Half To Even) que es el entero par más cercano a y.

No existe ninguna función Excel ni VBA que haga este redondeo.

 

 

Este método trata los valores positivos y negativos simétricamente, y está por eso, libre del sesgo del signo. Mejor aún, para razonables distribuciones de valores de y, el valor esperado de los números redondeados es el mismo que el de los números originales. Sin embargo, esta regla introduce un sesgo hacia el cero en los números pares y un sesgo hacia infinito en los números impares.

Esta variante de redondeo al más cercano, también se llama redondeo sin sesgo (Unbiased Rounding), redondeo convergente (Convergent Rounding), redondeo estadístico (Statistician's Rounding), redondeo holandés (Dutch Rounding), redondeo gausiano (Gaussian Rounding), redondeo par-impar (Odd-Even Rounding) o redondeo del banquero (Bankers' Rounding), y es ampliamente usado en contabilidad.

Este es el método usado en las funciones y operadores de la aritmética de punto flotante usada en IEEE 754.

Desempate la mitad hacia el impar (Round Half To Odd) que es el entero impar más cercano a y.

No existe ninguna función Excel ni VBA que haga este redondeo.

 

 

Este método también trata los valores positivos y negativos simétricamente, y está por eso, libre del sesgo del signo. Mejor aún, para distribuciones razonables de valores de y, el valor (medio) esperado de los números redondeados es el mismo que el de los números originales. Sin embargo, esta regla introducirá un sesgo hacia infinito para los números pares y un sesgo hacia cero, para los números impares.

Esta variante no es usada casi nunca en computación, excepto en situaciones donde se quiere evitar redondear  0,5  o  −0,5  a cero; o para evitar incrementar la escala (el exponente) en los números de punto flotante, que tienen un rango de exponentes limitado.

Desempate estocástico (Stochastic Rounding)

Otro método de desempate no sesgado es el redondeo estocástico (Stochastic Rounding):

Si la parte fraccionaria de y es .5, escoge que aleatoriamente entre y + 0.5 e y − 0.5, con igual probabilidad.

Como el redondeo la mitad hacia el par (Round-Half-To-Even), este método no sólo está libre de sesgo, sino que también reparte equitativamente que entre valores pares e impares. En contra, introduce un componente aleatorio en el resultado; si hacemos el mismo cálculo dos veces, podemos obtener dos resultados diferentes. También, es propenso a que los humanos (más que de los computadores o dispositivos elegidos) subconscientemente están “aleatoriamente” decidiendo en que dirección redondear.

Ningún producto de Microsoft implementa este método de desempate. La función personalizada RandRound, realiza este redondeo.

Desempate alternando (Alternating Tie-Breaking)

Un método, más oscuro que la mayoría, es redondear la mitad (el 5) alternativamente (Round Half Alternatingly).

Si la parte fraccionaria es 0,5, alternar el redondeo hacia arriba y hacia abajo: para el primer caso de una fracción terminada en 5, redondear hacia arriba; para la segunda ocurrencia, hacia abajo; y así, sucesivamente.

Esto suprime el componente aleatorio del resultado, si los casos con parte fraccionaria en 0,5 se pueden numerar. Pero puede todavía introducir un sesgo positivo o negativo (en función del redondeo inicial) al redondeo  si el número total de casos es impar.

Ningún producto de Microsoft implementa este método de desempate. La función personalizada AltRound, realiza este redondeo.

 

DOBLE REDONDEO

Redondear un número dos veces en sucesión a diferentes precisiones, con la última menos precisa, no garantiza que se obtenga el mismo resultado que redondear una vez con la precisión final, excepto en el caso de redondeo directo. Por ejemplo, redondear 9,46 a un decimal da 9.5, y luego 10 cuando redondeamos a entero usando redondeo mitad al par, pero daría 9 cuando redondeamos a entero directamente.

 

RESUMEN MÉTODOS DE REDONDEO

 


 

FUNCIONES DE REDONDEO DE VBA

La única función, en sentido estricto, de VBA es Round(). Las funciones Int(), Fix(), CInt(), CLng(), sólo convierten a números enteros, por lo que no son, propiamente, funciones de redondeo.

La función Round de VBA no es igual que la función REDONDEAR de Excel y Round de VBA Excel.

 

MÉTODOS DE REDONDEO DE EXCEL

 


 FUNCIONES VBA EXCEL

 

 

CÓDIGOS UTILIZADOS 

Function AsymDown(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double

' Asymmetrically rounds numbers down - similar to Int().

' Negative numbers get more negative.

      AsymDown = Int(X * Factor) / Factor

End Function

 

Function SymDown(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double

' Symmetrically rounds numbers down - similar to Fix().

' Truncates all numbers toward 0.

' Same as AsymDown for positive numbers.

      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

' Asymmetrically rounds numbers fractions up.

' Same as SymDown for negative numbers.

' Similar to Ceiling.

      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

' Symmetrically rounds fractions up - that is, away from 0.

' Same as AsymUp for positive numbers.

' Same as AsymDown for negative numbers.

      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

' Asymmetric arithmetic rounding - rounds .5 up always.

' Similar to Java worksheet Round function.

      AsymArith = Int(X * Factor + 0.5) / Factor

End Function

 

Function SymArith(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double

' Symmetric arithmetic rounding - rounds .5 away from 0.

' Same as AsymArith for positive numbers.

' Similar to Excel Worksheet Round function.

      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

' Banker's rounding.

' Rounds .5 up or down to achieve an even number.

' Symmetrical by definition.

' For smaller numbers:

' BRound = CLng(X * Factor) / Factor

      Dim Temp As Double

      Dim 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

' Random rounding.

' Rounds .5 up or down in a random fashion.

' 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

' Alternating rounding.

' Alternates between rounding .5 up or down.

      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

' sample wrapper functions

      ADownDigits = AsymDown(X, 10 ^ Digits)

End Function

 

'Function Ceiling2(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double

'      Ceiling2 = Application.WorksheetFunction.Ceiling(X, Factor)

'End Function

'

'Function Floor2(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double

'      Floor2 = Application.WorksheetFunction.Floor(X, Factor)

'End Function

'

'Function Round2(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double

'      Round2 = Application.WorksheetFunction.Round(X, Factor)

'End Function'

'

'Function RoundUp2(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double

'      RoundUp2 = Application.WorksheetFunction.RoundUp(X, Factor)

'End Function

'

'Function RoundDown2(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double

'      RoundDown2 = Application.WorksheetFunction.RoundDown(X, Factor)

'End Function

'

'Function MRound2(ByVal X As Double, Optional ByVal Factor As Double = 1) As Double

'      MRound2 = Application.WorksheetFunction.MRound(X, Factor)

'End Function 

 



Consulta también:

  Ir a Redondeo Parte 2

  https://en.wikipedia.org/wiki/Rounding

 

 

[Atrás]