Как сделать округление в access?

Как округлить в MS Access, VBA

Какой лучший способ округлить в VBA Access?

Мой текущий метод использует метод Excel

Но я ищу средство, которое не зависит от Excel.

12 ответов

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Будьте внимательны, функция округления VBA использует округление Банкира, где оно округляет .5 до четного числа, например так:

Принимая во внимание, что Функция Excel Worksheet Round, всегда округляет .5 вверх.

Я провел несколько тестов, и похоже, что округление до .5 (симметричное округление) также используется для форматирования ячеек, а также для округления ширины столбца (при использовании формата общего числа). Флаг «Точность как отображается», по-видимому, не выполняет никакого округления, он просто использует округленный результат формата ячейки.

Я попытался реализовать функцию SymArith от Microsoft в VBA для моего округления, но обнаружил, что Fix имеет ошибку, когда вы пытаетесь присвоить ей число, например 58.55; функция, дающая результат 58,5 вместо 58,6. Затем я наконец обнаружил, что вы можете использовать функцию Excel Worksheet Round, например:

Приложение. Раунд (58,55, 1)

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

Чтобы немного расширить принятый ответ:

««Функция Round выполняет округление до четности, которое отличается от округления к большему».
—Microsoft

Формат всегда округляется.

ACC2000: ошибки округления при использовании чисел с плавающей запятой: http://support.microsoft.com/kb/210423

ACC2000: Как округлить число вверх или вниз с желаемым приращением: http://support.microsoft.com/kb/209996

Как реализовать пользовательские процедуры округления: http://support.microsoft.com/kb/196652

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

Я в настоящее время использую функцию

который, кажется, работает нормально

и т. д. Вы часто обнаруживаете, что подобные грязные решения намного быстрее, чем использование функций Excel, потому что VBA работает в другом пространстве памяти.

например If A > B Then MaxAB = A Else MaxAB = B примерно в 40 раз быстрее, чем с помощью ExcelWorksheetFunction.Max

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

Int всегда округляется — Int (3.5) = 3, Int (-3.5) = -4

Фикс всегда округляет до нуля — Фикс (3.5) = 3, Фикс (-3.5) = -3

Есть также функции принуждения, в частности CInt и CLng, которые пытаются привести число к целочисленному типу или длинному типу (целые числа находятся в диапазоне от -32 768 до 32 767, длинные — от-2 147 483 648 до 2 147 483 647). Они оба будут округляться до ближайшего целого числа, округляясь от нуля от .5 — CInt (3.5) = 4, Cint (3.49) = 3, CInt (-3.5) = -4 и т.д.

Читать еще:  Как сделать маску ввода в access телефон?

К сожалению, встроенные функции VBA, которые могут выполнять округление, отсутствуют, ограничены, неточны или содержат ошибки, и каждая из них касается только одного метода округления. Плюс в том, что они быстрые, и это может быть важно в некоторых ситуациях.

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

Полный набор функций — для всех распространенных методов округления, для всех типов данных VBA, для любого значения и без возврата неожиданных значений — можно найти здесь:

Код только на GitHub:

Они охватывают обычные методы округления:

Округление вниз с возможностью округления отрицательных значений до нуля

Округление с возможностью округления отрицательных значений от нуля

Округление до 4/5, либо от нуля до четного (округление банкира)

Округлить до количества значащих цифр

Первые три функции принимают все числовые типы данных, а последняя существует в трех вариантах — для валюты, десятичной и двойной соответственно.

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

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

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

Если вы говорите о округлении до целочисленного значения (а не о округлении до n десятичных знаков), всегда есть старый способ:

(Вы можете сделать это для n знаков после запятой, но это становится немного грязным)

Ланс уже упоминал о округлении наследования bug в реализации VBA. Поэтому мне нужна реальная функция округления в приложении VB6. Вот тот, который я использую. Он основан на том, что я нашел в Интернете, как указано в комментариях.

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

Вот простой способ всегда округлять до следующего целого числа в Access 2003:

  • [Вес] = 5,33; Int ([Вес]) = 5; поэтому 5,33-5 = 0,33 (& lt;> 0), поэтому ответом является BillWt = 5 + 1 = 6.
  • [Вес] = 6.000, Int ([Вес]) = 6, поэтому 6.000-6 = 0, поэтому ответ BillWt = 6.

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

но это ВСЕГДА округлит до 2 десятичных знаков и может также привести к ошибке.

даже если оно отрицательное, оно округляется вверх (-1.011 будет -1.01, а 1.011 будет 1.02)

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

Читать еще:  Как сделать удаление в access?

(используется в модуле, если это не очевидно)

Округление в Аксессе

Для округления чисел в Access 2000 и более поздних версих есть встроенная функция Round().
Для более ранних версий используйте вот эту пользовательскую функцию округления Кена Гетца.

Встроенная функция

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

Скажем, у вас есть такое выражение в строке «Поле» в конструкторе запросов:
Налог: [Стоимость] * [СтавкаНалога]
Чтобы округлить до ближайшей копейки, используйте:
Налог: Round([Стоимость] * [СтавкаНалога], 2)

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

Чтобы округлить все дробные цифры до ближайшего целого вниз, используйте Int():
Int([МоеПоле])

Все эти числа будут округлены вниз до 2: 2,1, 2,5, 2,8, and 2,99.

Чтобы округлить вниз до ближайшей копейки (напр. 10,2199 руб становятся 10,21 руб), умножьте на 100, округлите, и затем разделите на 100:
Int(100 * [МоеПоле]) / 100

Заметьте, что получается при округлении вниз отрицательных величин: Int(-2.1) дает -3, так как это и есть целое число снизу. Чтобы округлять по направлению к нулю, используйте Fix() вместо Int():
Fix(100 * [МоеПоле]) / 100

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

Чтобы округлить вверх к ближайшему большему целому, воспользуйтесь способом, которым Int() округляет отрицательные числа:
— Int( — [МоеПоле])

Как показано выше, Int(-2.1) округляет вниз до -3. Поэтому такое выражение округляет 2,1 до to 3.

Чтобы округлить вверх до ближайшей копейки, умножьте на -100, округлите, и разделите на -100:
Int(-100 * [МоеПоле]) / -100

Округлить до ближайших 5 копеек

Чтобы округлить до ближайших 5 копеек, умножьте число на 20, округлите его, и разделите на 20:
Round(20 * [МоеПоле], 0) / 20

Подобным образом, чтобы округлить до ближайшего четвертака, умножьте на 4, округлите, и разделите на 4:
Round(4 * [МоеПоле], 0) / 4

Округлить до 1000 руб.

Функция Round() в Excel принимает отрицательные числа в качестве количества мест от запятой, напр. Round(123456, -3) округляет до 1000. К сожалению, аксессовская функция этого не поддерживает.

Чтобы округлить до ближайших 1000 руб., разделите на 1000, округлите, и умножьте на 1000. Пример:
1000 * Round([Стоимость] / 1000, 0)

Чтобы округлить до 1000 руб. вниз, разделите на 1000, получите целое число и умножьте на 1000. Пример:
1000 * Int([Стоимость] / 1000)

Чтобы округлить до верхней 1000 руб., разделите на 1000 и умножьте на -1 перед получением целой величины. Пример:
-1000 * Int( [Стоимость] / -1000)

Чтобы округлить в сторону нуля, используйте Fix() вместо Int().

Альтернативно, пользовательская функция Кена Гетца ведет себя в точности как упомнутая экселевская функция.

Зачем округлять?

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

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

Читать еще:  Как сделать печатную форму в access?

Это также относится и к денежным полям. Аксесс отображает денежные поля округленными до ближайшей копейки, но хранит их значение до сотой доли копейки (4 знака после запятой.)

Банковское округление

Функция Round() в Аксессе использует «банковское округление». Когда последней значащей цифрой оказывается 5, она округляет до ближайшего четной цифры. Так, 0,125 округляется до 0,12 (2 четно), в то время как 0,135 округляется до 0,14 (4 четно.)

Главный смысл здесь — равенство: 1,2,3, и 4 округляются вниз. 6,7,8, и 9 — вверх. 0 не требует округления. Так, если 5 все время округлять вверх, вы получите «сдвинутые» результаты — 4 цифры округляются вниз, и 5 вверх. Чтобы избежать этого, «третий лишний» (5) округляется в соответствии с предыдущей цифрой, что сглаживает неравенство.

Если вы не хотите использовать банковское округление, возьмите функцию Кена Гетца (ссылка вверху.)

Ошибки плавающей запятой

Дробные величины компьютер обычно трактует как числа с плавающей точкой. Аксессовские поля типов Двойной точности (Double) или Одинарной точности (Single) относятся к такому типу. Тип «Двойной точности» дает около 15 знаков точности, сингл — 8 знаков (подобно ручному калькулятору).

Но эти числа являются приблизительными. Точно так же, как 1/3 требует бесконечного количества знаков в десятичной системе, большинство чисел с плавающей запятой не могут быть представлены точно в двоичной системе. Википедия объясняет проблему точности, с которой вы сталкиваетесь, оперируя числами с плавающей запятой.

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

Один из способов избежать подобных проблем — использовать числа с фиксированной запятой или мастшабированные числа.Тип данных «Денежный» в Аксессе является типом с фиксированной запятой: он всегда хранит 4 десятичных знака.

Например, откройте окно Immediate Window (Ctrl+G) и введите:
? Round(CCur(.545),2), Round(CDbl(.545),2)
Денежный тип (первый) возвращает 0,54, тогда как Двойной точности — 0,55. Денежный округляет корректно (к четной цифре 4); тип с плавающей запятой (Двойной точности) некорректно. Подобным образом, если вы попробуете 8,995, Денежный корректно округлит вверх (к четной цифре 0), в то время как тип Двойной точности округлит вниз (неверно.)

Денежный тип справляется только с 4 десятичными знаками. Используйте масштабируемый тип Действительный (Decimal), если вам нужно больше знаков после запятой.

Округление дат и времени

Обратите внимание, что тип Дата/Время в Аксессе является особым видом типа с плавающей запятой, в котором дробная часть обозначает время дня. Следовательно, поля типа Дата/Время с компонентой времени также подвержены ошибкам округления.

Функция ниже округляет дату/время до указанного количества секунд. Например, чтобы округлить до ближайшего получаса (30 * 60 seconds), используйте:
=RoundTime([МоеПолеДатаВремя], 1800)

Заключение

Для более детального технического объяснения теории округления в целом, см. статью Клайва Максфилда (Clive Maxfield) An introduction to different rounding algorithms.

Ссылка на основную публикацию
Adblock
detector