Как сделать чтобы 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

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

Как реализовать пользовательские процедуры округления: 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 и т.д.

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

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

Читать еще:  Как сделать прайс лист в access?

Полный набор функций — для всех распространенных методов округления, для всех типов данных 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.
Читать еще:  Как сделать подчиненную форму в access 2010?

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

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

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

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

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

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