Как реализовать пользовательский округления процедуры

Переводы статьи Переводы статьи
Код статьи: 196652 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

Существует множество различных алгоритмов округления в продуктах корпорации Майкрософт. Округление алгоритмы диапазон от округления в арифметических операций в функции Round() лист Microsoft Excel до его Banker округление в CInt() CLng() и Round() функций в Visual Basic для приложений. Эта статья какие различные Visual Basic для приложений, сделать округления функции и приведены примеры использования функций. Кроме того статья содержит пример функции, которые реализуют различные алгоритмы округления.

Дополнительная информация

Описание округления

Необходимо округлить для преобразования числа большую точность в число меньшее значение точности. — Это наиболее распространенный случай, когда необходимо преобразовать в целое число с плавающей запятой.

Округление вниз

Простейшая форма округления является усечение. Любые цифры после требуемого точности, просто игнорируются. Функции VBA Fix() приведен пример усечения. Например Fix(3.5)-3; Fix(-3.5) -3.

Функция Int() округляется до максимально целого меньше значения. Int() и Fix() действовать так же, как с - усечение - положительные числа, но дать разные результаты для отрицательных чисел: Int(-3.5) дает -4.

Функция Fix() является примером симметричный округления, так как она влияет на величину положительных и отрицательных чисел (абсолютное значение) таким же образом. Функция Int() является примером асимметричного округления, так как она влияет на величину положительных и отрицательных чисел по-разному.

Excel имеет аналогичные функции: Int() Floor() и RoundDown(). Int() работает так же, как Int() в Visual Basic для приложений. Floor() усекает положительные значения, но не работает с отрицательными числами. Функция RoundDown() работает так же, как функция Fix() VBA.

Microsoft SQL Server имеет Round() функцию, которая может действовать как функция Fix() VBA. SQL Server также содержит функции Floor() работает так же, как функция VBA Int().

Округление вверх

SQL Server и Microsoft Excel имеют функцию с именем Ceiling(), который всегда округляет дробную часть значения вверх (более положительный), следующее значение.

Visual Basic для приложений не имеет соответствующей функции до цикла. Тем не менее для отрицательных чисел Int() и Fix() можно использовать для округления вверх, по-разному.

Округляет Fix() от 0 (вверх в абсолютном смысле, но вниз в терминах абсолютную величину). Fix(-3.5) является-3.5.

Округляет Int() от 0 (вверх в терминах абсолютная величина, но вниз в том смысле, абсолютный). Int(-3.5) это -4.

Арифметическое округление

При округлении всегда вверх или вниз, результата не обязательно ближе к исходного числа. Например если округлить 1,9 до 1, различие гораздо больше, если оно округляется до 2. Удобно для просмотра округления чисел из 1.6 2.4 2.

Однако, как насчет 1.5, который является equidistant между 1 и 2? В соответствии с соглашением как часть числа округляется с избытком.

Округление чисел как половина в симметричном режиме, можно реализовать, -0,5 округляется вниз до -1 или асимметричных операция, где -0,5 округляется до 0.

Следующие функции обеспечивают симметричное арифметическое округление.
Функция электронной таблицы Excel Round().
Функция Round() SQL Server может выполнять симметричное арифметическое округление.

Следующие функции обеспечивают асимметричного арифметическое округление.
Метод Round() Java математические библиотеки.

Visual Basic для приложений, не все функции, которая выполняет арифметическое округление.

Округление банковским

При добавлении округленные значения друг с другом, всегда округления 0,5, в том же направлении приводит смещение, которое увеличивается с номерами больше сложить. — Это один из способов минимизировать сдвиг с банковским округлением.

Округляет округления банковским 0,5 иногда вверх и вниз в некоторых случаях. Соглашение, округляемое до ближайшего четного числа, поэтому 1.5 и 2.5 округляются до 2 и 3.5 4.5 и округляется до 4. Банковским округлением является симметричным.

В Visual Basic для приложений, следующие числовые функции выполняют банковским округлением: CByte(), CInt(), CLng() CCur() и Round().

Нет функции электронной таблицы Excel, выполняющие банковским округлением.

Случайные округления

Даже банковским округлением может смещение итоговых значений. Можно выполнить дополнительный шаг, чтобы удалить уровень защиты, округляя 0,5 вверх или вниз, действительно случайным образом. Таким образом, даже если данные сознательно — это смещение, смещение может быть свернута. Тем не менее с использованием случайных округления со случайным образом распределенных данных может привести больший уровень защиты, чем банковским округлением. Случайные округления может привести к два различных итоговых значений на тех же данных.

Продукты корпорации Майкрософт не реализации любого рода случайных процедуры округления.

Дополнительный округления

Альтернативные округления округления между 0,5 вверх и вниз 0,5 при последующих вызовах.

Продуктов корпорации Майкрософт не реализует процедуру альтернативного округления.

Функция Round() будет реализовано непоследовательно

Истории из соображений Round() функция не реализована в согласованным среди различных продуктов корпорации Майкрософт.

В приведенной ниже таблице продукта относительно реализации:
   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
				

Функция Round() в Visual Basic 6.0 и Visual Basic 6.0 приложения выполняет банковским округлением. Он имеет необязательный второй аргумент, определяющий количество десятичных разрядов округления для:
   Debug.Print Round(2.45, 1) returns 2.4.
				

Пример данных

Ниже приведены некоторые образцы данных и влияние различных методов округления чисел и создания итогов.
   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
				

Сумма всех чисел:
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   0.0    -9   0   9       3            0           0        1      0
				

Сумма всех отрицательных чисел:
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   -13.5  -18  -9  -9      -12          -15         -13      -13    -14
				

Сумма всех положительных чисел.
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   13.5   9    9   18      15           15          13       14     14
				

В таблице приведены различия между различными способами округления. Случайно распределенного положительные и отрицательные числа Fix(), симметричное арифметическое округление, банковским округлением и чередующихся округления предоставить как минимум отличием от фактической суммы, случайные округления не далеко позади.

Тем не менее если номера либо все положительными или отрицательными, банковским округления, чередующихся округления и случайных округления обеспечивают наименьший отличием от фактических сумм.

Пример пользовательской функции округления

В примере кода в разделе список функций предоставляет пример реализации для каждого типа округления описано.

Функции, предоставляемые являются:
   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.
				

Все эти функции принимают два аргументы: округляемое число и дополнительный фактор. Если коэффициент опущен, функции возвращают целое число, созданного одним из описанных способов. Если коэффициент указан, число масштабируется по коэффициент для создания различных эффектов округления. Например AsymArith (2.55, 10) дает 2.6, то есть, он округляется до 1/Коэффициент = 1/10 = 0,1.

Примечание: Коэффициент 0 приводит к ошибке во время выполнения: 1/Коэффициент = 1/0.

В приведенной ниже таблице показано влияние различных факторов:
   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.
				

К описанию исключение ADownDigits, что функции шаблона, которая позволяет задать число десятичных знаков вместо коэффициент.
   Expression            Result Comment
   ---------------------------------------------------------------------
   ADownDigits(2.18, 1)    2.1  Rounds down to next multiple of 10 ^ -1.
				

Список функций


   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
				

Примечание: С исключением Excel MRound() функция, встроенные – в округления функции принимают аргументы таким образом ADownDigits, где второй аргумент определяет количество цифр, вместо коэффициента.

Реализации округления, представленные здесь используется фактор, такие как MRound(), которой является более гибкой, потому что у вас нет округляемое степенью 10. Таким образом ADownDigits можно создавать функции оболочки.

С плавающей точкой ограничения

Все реализации округления, представленные здесь используют тип данных double, который может представлять около 15 десятичных цифр.

Так как не все дробные значения можно выразить точно так же, можно получить непредвиденные результаты, поскольку отображаемое значение не соответствует сохраненному значению.

Например, номер 2,25 могут храниться внутри как 2.2499999..., который бы округлить с арифметическое округление, вместо копии как можно ожидать. Кроме того дополнительные вычисления числа помещается через большую вероятность того, сохраненные двоичные значения будут отклоняться от идеальной десятичное значение.

Если это так, можно выбрать другой тип данных, таких как валюта, являющегося точной до 4 десятичных разрядов.

Также можно сделать, типы данных Variant и использование CDec(), чтобы преобразовать все, что тип данных Decimal, который может быть точное с 28 десятичными цифрами.

Округление значения валюты

Если используется тип данных Currency, являющегося точной до 4 цифр, обычно требуется округлить до 2 знаков после запятой для сотен.

Функцию Round2CB является вариантом жестко, выполняет банковским округлением до 2 десятичных цифр, но не умножения исходного числа. Это позволяет избежать возможно переполнение условие, если денежные суммы приближается ограничений на тип данных Currency.
   Function Round2CB (ByVal X As Currency) As Currency
     Round2CB = CCur(X / 100) * 100
   End Function
				

Округление значения Decimal

Ниже приведен пример использования асимметричного арифметическое округление с использованием типа данных 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
				

Удаление точность как на ярлык в округления

При изучении в школе округления является обычно арифметическое округление с положительными числами. Этот тип округления достаточно знать номер 1 цифру последние где округление до. Игнорировать цифры после первого десятичного разряда. Другими словами точность удаляется как ярлык для округления значения.

Например 2.5 и 2.51 круглых до 3, а 2,4 и 2.49 округлить до 2.

При использовании банковским округлением (или других методов, 0,5 округляется, вверх или вниз) или округления отрицательные числа, с помощью асимметричного арифметическое округление, удаление точность может привести к неверные результаты которых, может не округляется до ближайшего числа.

Например с банковским округлением, 2.5 округляется до 2 и 2.51 округление до 3.

С помощью асимметричного арифметическое округление,-2.5 округляется до -2, пока-2.51 округляется до -3.

Определяемые пользователем функции, представленные в этой статье учитывать полной точностью номер при выполнении округления.

Ссылки

Справки Visual Basic версии 6.0, раздел: Int, функции Fix; функция Round

Transact SQL Справка; раздел: функция Round; функция Floor Потолочная функции

(c) Корпорация Майкрософт 1998 года, все права защищены. Вклад Алексей Стюард, корпорация Майкрософт.

Свойства

Код статьи: 196652 - Последний отзыв: 15 ноября 2010 г. - Revision: 2.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual Basic Control Creation Edition
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • 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
Ключевые слова: 
kbhowto kbmt KB196652 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:196652

Отправить отзыв

 

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