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

ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.

Эта статья на английском языке:196652
Эта статья помещена в архив. Она предлагается "как есть" и обновляться не будет.
Аннотация
Существует множество различных алгоритмов округления в продуктах корпорации Майкрософт. Округление алгоритмы диапазон от округления в арифметических операций в функции 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 — последний просмотр: 12/05/2015 09:52:22 — редакция: 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

  • kbnosurvey kbarchive kbhowto kbmt KB196652 KbMtru
Отзывы и предложения