Cómo personalizar implementar procedimientos de redondeo

Seleccione idioma Seleccione idioma
Id. de artículo: 196652 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

No hay un número de diferentes algoritmos de redondeo disponibles en los productos de Microsoft. Redondeo algoritmos comprendidos redondeo en aritmética en función de hoja de cálculo Round() de Excel y redondeo del banquero en las funciones CEntero(), CLng() y Round() en Visual Basic para aplicaciones. Este artículo describe qué el distintos de Visual Basic para aplicaciones redondeo de las funciones pendientes y proporciona ejemplos de las funciones. Además, el artículo incluye funciones de ejemplo que implementan varios algoritmos de redondeo.

Más información

Redondeo explicación

Deberá redondear cuando desea convertir a un número de mayor precisión en un número de menor precisión. El caso más común es cuando necesita convertir a un número de punto flotante en un entero.

Redondeo hacia abajo

La forma más sencilla de redondeo es truncamiento. Simplemente se omiten los dígitos situados tras la precisión deseado. La función VBA Fix() es un ejemplo del 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 inferior al valor. Int() y Fix() actúan del mismo modo con números positivos - truncar - pero dan resultados diferentes para los números negativos: Int(-3.5) proporciona-4.

La función Fix() es un ejemplo de redondeo simétrico porque afecta a la magnitud (valor absoluto) de números positivos y negativos de la misma manera. La función int() es un ejemplo de redondeo asimétrico porque afecta a la magnitud de los números positivos y negativos diferente.

Excel tiene funciones de hoja de cálculo similares: Int() Floor() y RoundDown(). Int() funciona del mismo modo int() en Visual Basic para aplicaciones. Floor() trunca los valores positivos, pero no funciona con los números negativos. La función RoundDown() funciona del mismo modo que la función VBA Fix().

Microsoft SQL Server tiene una función de Round() puede actuar como la función VBA Fix(). SQL Server también tiene una función Floor(), que funciona igual que la función de VBA int().

Redondeo de

SQL Server y Excel tienen una función denominada Ceiling(), que siempre redondea los valores fracción hasta (más positivo) el valor siguiente.

Visual Basic para aplicaciones no tiene una función de redondeo telefónico correspondiente. Sin embargo, para números negativos, Fix() y int() pueden utilizarse para redondear hacia arriba, de diferentes maneras.

Fix() redondea hacia 0 (copia en el sentido absoluto, pero hacia abajo en términos de magnitud absoluto). Fix(-3.5) es-3.5.

Redondea int() al alza (up en términos de magnitud absoluto, pero hacia abajo en el sentido absoluto). Int(-3.5) es-4.

Redondeo en aritmética

Para redondear siempre hacia abajo o arriba, el número resultante no es necesariamente el más cercano al número original. Por ejemplo, si redondear 1,9 a 1, la diferencia es mucho mayor que si se redondeará hasta 2. Es fácil ver que se deben redondear números de 1,6 a 2,4 a 2.

Sin embargo, ¿qué sucede 1.5, que es equidistante entre 1 y 2? Por convención, el número de mitad de se redondea hacia arriba.

Puede implementar redondeando mitad de los números de forma simétrica, que se redondea-.5 en -1 o en una forma asimétrica, donde-.5 se redondea a 0.

Las siguientes funciones proporcionan redondeo aritméticos simétrico:
La función de hoja de cálculo de Excel Round().
Puede realizar la función de SQL Server Round() redondeo aritméticos simétrico.

La siguiente función proporcionan redondeo aritméticos asimétrico:
El método Round() de la biblioteca Java Math.

Visual Basic para aplicaciones no tiene ninguna función que realiza la aritmética de redondeo.

Redondeo del banquero

Al agregar valores redondeados juntos, siempre redondeo 0,5 en la misma dirección da como resultado una diferencia que crece con los números más agrega juntos. Una forma de reducir la diferencia es con redondeo bancario.

Redondea de redondeo del banquero 0,5 up a veces y a veces abajo. La convención es para redondear al número par más cercano, por lo que 1,5 y 2,5 se redondean al 3.5, 2 y 4.5 que ambos redondean a 4. Redondeo bancario es simétrica.

En Visual Basic para aplicaciones, las siguientes funciones numérico realizan redondeo bancario: CByte(), CEntero(), CLng(), CCur() y Round().

No hay funciones de hoja de cálculo de Excel que realizan redondeo bancario.

Redondeo aleatorio

Incluso del redondeo, puede desviar totales. Puede tomar un paso adicional para quitar la diferencia por redondeo 0,5 hacia arriba o hacia abajo de forma verdaderamente aleatoria. De este modo, incluso si los datos es deliberadamente sesgados, diferencia podría reducirse. Sin embargo, mediante el redondeo aleatorio con datos distribuidos aleatoriamente puede dar lugar una mayor diferencia de redondeo bancario. Redondeo aleatorio puede provocar dos totales diferentes en los mismos datos.

No hay productos de Microsoft implementan a algún tipo de procedimiento redondeo aleatorio.

Alternativas de redondeo

Redondeo alternativo es redondeo entre 0,5 hacia arriba y abajo 0,5 en sucesivas llamadas.

No hay productos de Microsoft implementan un procedimiento alternativo de redondeo.

La función Round() está implementado de forma incoherente

La función de Round() no está implementada de forma coherente entre diferentes productos de Microsoft por motivos históricos.

La siguiente tabla se relaciona con producto implementación:
   Product                             Implementation
   ----------------------------------------------------------------------
   Visual Basic for Applications 6.0   Banker's Rounding
   Excel Worksheet                     Symmetric Arithmetic Rounding
   SQL Server                          Either Symmetric Arithmetic Rounding
                                       or Symmetric Round Down (Fix)
                                       depending on arguments

   Java Math library                   Asymmetric Arithmetic Rounding
				

La función Round() en Visual Basic 6.0 y Visual Basic para aplicaciones 6.0 realiza redondeo bancario. Tiene un argumento de segundo opcional que especifica el número de dígitos decimales redondear la cifra para:
   Debug.Print Round(2.45, 1) returns 2.4.
				

Datos de ejemplo

La tabla siguiente muestra algunos datos de ejemplo y los efectos de distintos métodos de redondeo en los números y los totales generados.
   Number/Int./Fix/Ceiling/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
   -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:
   Number/Int./Fix/Ceiling/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:
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   -13.5  -18  -9  -9      -12          -15         -13      -13    -14
				

Total de todos los números positivos:
   Number/Int./Fix/Ceiling/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 distintos métodos de redondeo. Para números positivos y negativos distribuidos aleatoriamente, Fix(), redondeo aritméticos simétrico, redondeo bancario y redondeo alternos proporcionan la diferencia menor de los totales reales, con el redondeo aleatorio no atrasada.

Sin embargo, si los números están bien de todo positivo o negativo todo, banquero redondeo, alternos redondeo y redondeo aleatorio proporcionan la diferencia menor de los totales reales.

Funciones de redondeo definido por el usuario de ejemplo

El código de ejemplo en la sección lista de la función siguiente proporciona implementaciones de ejemplo para cada uno de los tipos de redondeo que se describen.

Las funciones proporcionadas son:
   AsymDown      Asymmetrically rounds numbers down - similar to Int().
                 Negative numbers get more negative.

   SymDown       Symmetrically rounds numbers down - similar to Fix().
                 Truncates all numbers toward 0.
                 Same as AsymDown for positive numbers.

   AsymUp        Asymmetrically rounds numbers fractions up.
                 Same as SymDown for negative numbers.
                 Similar to Ceiling.

   SymUp         Symmetrically rounds fractions up - that is, away from 0.
                 Same as AsymUp for positive numbers.
                 Same as AsymDown for negative numbers.

   AsymArith     Asymmetric arithmetic rounding - rounds .5 up always.
                 Similar to Java worksheet Round function.

   SymArith      Symmetric arithmetic rounding - rounds .5 away from 0.
                 Same as AsymArith for positive numbers.
                 Similar to Excel Worksheet Round function.

   BRound        Banker's rounding.
                 Rounds .5 up or down to achieve an even number.
                 Symmetrical by definition.

   RandRound     Random rounding.
                 Rounds .5 up or down in a random fashion.

   AltRound      Alternating rounding.
                 Alternates between rounding .5 up or down.

   ATruncDigits  Same as AsyncTrunc but takes different arguments.
				

Todas estas funciones toman dos argumentos: el número se redondeará y un factor opcional. Si el factor se omite, las funciones devuelven un entero creado por uno de los métodos anteriores. Si se especifica el factor, se ajusta el número por el factor para crear diferentes efectos de redondeo. Por ejemplo AsymArith (2.55, 10) produce 2.6, es decir, redondea a 1/factor = 1/10 = 0,1.

Nota: Factor de 0 genera un error en tiempo de ejecución: factor/1 = 1/0.

La siguiente tabla muestra los efectos de diversos factores:
   Expression       Result  Comment
   --------------------------------------------------------------------
   AsymArith(2.5)     3     Rounds up to next integer.
   BRound(2.18, 20)   2.2   Rounds to the nearest 5 cents (1/20 dollar).
   SymDown(25, .1)   20     Rounds down to an even multiple of 10.
				

La excepción a la descripción anterior es ADownDigits, que es una función de plantilla que permite especificar el número de dígitos decimales en lugar de un factor.
   Expression            Result Comment
   ---------------------------------------------------------------------
   ADownDigits(2.18, 1)    2.1  Rounds down to next multiple of 10 ^ -1.
				

Lista de función


   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 función de Excel MRound() hoja de cálculo, la generación - en redondeo funciones aceptan argumentos de la manera ADownDigits, donde el segundo argumento especifica el número de dígitos en lugar de un factor.

Las implementaciones de redondeo presentadas utilizar un factor, como MRound(), que es más flexible ya no es necesario redondear a una potencia de 10. Puede escribir funciones contenedoras de la manera ADownDigits.

Limitaciones de punto de flotante

Todos las implementaciones de redondeo presentadas utilizan el tipo de datos double, que puede representar aproximadamente 15 dígitos decimales.

Puesto que no todos los valores fraccionarios se pueden expresar exactamente, puede obtener resultados inesperados debido a que el valor de presentación no coincide con el valor almacenado.

Por ejemplo, el número 2,25 podría almacenará internamente como 2.2499999..., que podría redondear hacia abajo con aritmética de redondeo, en lugar de configurar como cabría esperar. Además, los cálculos más que un número se somete a la posibilidad mayor que el valor binario almacenado se desviarse del valor decimal ideal.

Si éste es el caso, desea elegir un tipo de datos diferentes, como moneda, que es exacto de 4 posiciones decimales.

También puede realizar los tipos de datos Variant y uso CDec() para convertir todo en el tipo de datos decimal, que puede ser exacto a 28 dígitos decimales.

Redondeo a valores monetarios

Cuando utiliza el tipo de datos de moneda, que es exacto hasta 4 dígitos decimales, normalmente se desea redondear 2 dígitos decimales para centavos.

La función de Round2CB siguiente es una variación rígida que se realiza redondeo bancario 2 dígitos decimales, pero no se multiplica al número original. Esto evita una condición de desbordamiento posible si el importe monetario se está acercando los límites del tipo de datos moneda.
   Function Round2CB (ByVal X As Currency) As Currency
     Round2CB = CCur(X / 100) * 100
   End Function
				

Redondeo valores decimales

El siguiente es un ejemplo de asimétrico aritméticos redondeo utilizando el tipo de datos decimal:
   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) + .5)
     End If
   End Function
				

Precisión de colocar como un acceso directo de redondeo

Como aprendida en la escuela, redondeo es normalmente aritmético números positivos de redondeo. Con este tipo de redondeo, sólo necesita saber el número 1 dígito pasado donde se redondeo al. Omitir dígitos más allá de la primera posición de decimal. En otras palabras, la precisión se interrumpe como un acceso directo para el valor de redondeo.

Por ejemplo, 2.5 y 2.51 redondear hasta 3, mientras tanto 2.4 2.49 redondear hacia abajo a 2.

Cuando utiliza redondeo bancario (u otros métodos que redondean 0,5 hacia arriba o hacia abajo) o al redondear los números negativos utilizando el redondeo aritméticos asimétrico, eliminando la precisión puede provocar resultados incorrectos donde podría no redondear el número más cercano.

Por ejemplo, con redondeo bancario, 2.5 redondea hacia abajo a 2 y 2.51 se redondea hasta 3.

Con el redondeo aritméticos asimétrico,-2.5 redondea hasta-2 mientras-2.51 redondea hacia abajo en -3.

Las funciones definidas por el usuario presentadas en este artículo tienen precisión completa del número en cuenta cuando se realiza redondeo.

Referencias

Ayuda de Visual Basic, versión 6.0; tema: Int, Fix Functions; la función Round

Transact SQL Ayuda de Microsoft; tema: función de redondeo, en función; función Ceiling

(c) 1998 Microsoft Corporation, reservados todos los derechos. Contribuciones por Malcolm Stewart, Corporation.

Propiedades

Id. de artículo: 196652 - Última revisión: jueves, 15 de julio de 2004 - Versión: 3.2
La información de este artículo se refiere a:
  • Microsoft Visual Basic Control Creation Edition
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Edición de aprendizaje
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic for Applications 5.0
  • Microsoft Visual Basic for Applications 6.0
  • Microsoft SQL Server 6.0 Standard Edition
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Palabras clave: 
kbmt kbhowto KB196652 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 196652

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com