Округление до сотых vba

Округление до сотых vba

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

Первый способ округления при помощью функции int().

Данная функция выводит целое значение до запятой. При округлении отрицательных чисел int округляет десятичную дробь до большего целого значения.
Например: число Пи с минусом после округления — int (-3.1415926535 ) будет равно 4 (четырем целым).

Второй способ округление при помощи функции fix()

происходит аналогично с int . Отличается эта функция тем, что округляет отрицательные числа до меньшего значения. Так округлённое число Пи со знаком минус будет fix( -3.1415926535) = 3.
Если требуется не просто убрать дробную часть, а округлить до целого числа, можно использовать следующую функцию cint().
Пример:
Cint(fix( -3.1415926535)) = 3
Cint(int( -3.1415926535)) = 3

Как округлять до десятых и сотых (один и два знака после запятой, соответственно).

Для округления до десятых следует умножить переменную на 10 (десять), после чего округлить до целых и разделить на 10 (десять).
Пример:
Cint(int( -3.1415926535*10))/10 = 3.1
Cint(fix( -3.1415926535*10))/10 = 3.1

Для округления до сотых следует проделать ту же самую операцию, только умножать и делить не на 10, а на 100.
Пример:
Cint(int( -3.1415926535*100))/100 = 3.14
Cint(fix( -3.1415926535*100))/100 = 3.14

Пример кода округляющего значения из textbox, запускающийся нажатием кнопки CommandButtom1:

Private sub CommandButtom1_click()
textbox2.value = Cint(int(textbox1.value *100))/100
END SUB

Видео с примером работы макроса:

Как видите, ничего сложного в округлении чисел в vba Excel нет. Удачи Вам в изучении программы

Похожее:

  1. Макрос определяющий пустая ли ячейка или заполненная в VBA ExcelМакрос проверки заполнения ячеек. Периодически при создании.
  2. Функция VAL в VBA Excel или как преобразовать TextBox в число (цифру).Использования функции преобразования текста в число в.
  3. Макрос для быстрой замены формул на значения (числа) в выделенных ячейках документа Excel.Когда удобно менять формулы на значения нажатием.

Округление значений в коде VBA в Excel. Функции int () и fix().: 1 комментарий

Cint(int(-3.1415926535*100))/100 = 3.1
А это надёжно? Я вместо сотней поставил 1000 и в одном из случаев произошла ошибка переполнения. Опять поставил сотни.

Округление – экселевские причуды и несоответствия одной из «причуд» Excelя, которая может вызвать некоторую путаницу, если о ней не знаешь — это применение программой двух разных алгоритмов округления чисел. Далее обо всем по порядку.

Разный результат округления в Excel и VBA

Последствия существования «причуд» на рисунке ниже:

Как вы можете видеть на рисунке, результаты округления (и итоги) СУЩЕСТВЕННО ОТЛИЧАЮТСЯ!

Все что было сделано, так это округлено каждое из чисел, а затем суммирование их. В первом случае (столбец B) был округлен с помощью стандартной экселевской функции ОКРУГЛ, во втором случае (столбец C) – было использовано написанную в VBA функцию пользователя, которая, однако, не делает ничего иного, кроме как только округляя указанные числа, но используя доступную в VBA функцию Round(). Чтобы посмотреть соответствующий код макроса для пользовательской функции нажмите комбинацию горячих клавиш ALT+F11:

Читайте также:  Как сменить раскладку клавиатуры в ubuntu

В Module1 прописан код пользовательской макро-функции.

Функция ОКРУГЛ и Round VBA округляют по-разному?

В функции ОКРУГЛ, доступной в Excelе, использовался стандартный алгоритм, в котором «половинки» (пятерки в конце разряда десятичной дроби) округлены ВСЕГДА в большую сторону. То есть 2,5 округляется до 3; 10,345 до 10,35 и т. д. Это именно то правило, которое мы выучили в школе, и тот результат, который ожидало бы получить большинство из нас.

В случае использования доступных в VBA функций, (кроме Round () это также CByte (), CInt (), CLng () и CCur () ) используется алгоритм, называемый банковским или методом Гаусса. Здесь «половинки» округляются раз в большую сторону, а раз в меньшую сторону, всегда к ближайшему четному. Поэтому 5,5, как и в случае использования экселевской функции, будет округлено до 6. Однако VBA поступит иначе, например, с числом 2,5 — оно будет округлено до 2, а не до 3!

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

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

Здесь то же самое, что и в первом примере. Округлено каждое из чисел, а затем суммированы итоги. Полученные итоги сравниваются с итогом, который бы получил если бы не округлялись числа. Как видно, при применении банковского алгоритма округления чисел, используемого в VBA, полученный итог является намного более точным к «оригинальному» итогу. Это происходит из-за того, что банковский алгоритм округляя раз в большую сторону, раз в меньшую сторону, «амортизирует» ошибки, возникающие в результате округления.

Несоответствия функций округления в Excel и VBA

Можно было бы ожидать, что в Excelе выполнено простое разделение: экселевские функции используют один алгоритм, а функции VBA — другой. Это было бы все равно странным, но, по крайней мере, имело бы какую-то внутреннюю согласованность. К сожалению, программисты Microsoft по какой-то причине были очень непоследовательными и, например, в других функциях VBA, таких как FormatNumber или Format (при форматировании чисел с использованием этих функций в зависимости от выбранного формата также может происходить округление) используется стандартный алгоритм округления:

Читайте также:  Ошибка гта 5 d3dx9 43 dll

Следовательно, функция VBA Round (2,5, 0) вернет как результат 2, но уже функция FormatNumber (2,5, 0) вернет как результат 3. И где здесь логика?

Подытожим особенности округления чисел в Excel

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

Как уже выше упоминалось, один алгоритм не является лучше или хуже другого. Каждый хорош в зависимости от применения. Стандартный алгоритм дает результаты, которые мы «ожидаем», в отличие от банковского алгоритма, который, помимо прочего, немного удивляет результатами.

Жаль, что эти два алгоритма были реализованы одновременно, кроме того, довольно хаотичным образом. Возможно было бы более естественным, если бы функция VBA Round() возвращала тот же результат, что и экселевская функция ОКРУГЛ (в конце концов, в английской версии Excelя, она называется также — ROUND).

каков наилучший способ округления в доступе VBA?

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

но я ищу средство, которое не полагается на Excel.

12 ответов

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

в то время как функция листа Excel круглый, всегда округляет .5 вверх.

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

Я попытался реализовать функцию SymArith от Microsoft в VBA для моего округления, но обнаружил, что исправление имеет ошибку, когда вы пытаетесь дать ему число, подобное 58.55; функция дает результат 58.5 вместо 58.6. Затем я, наконец, обнаружил, что вы можете использовать круглую функцию листа Excel, например:

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

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

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

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

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

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

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

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

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

который, кажется, работает хорошо

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

Читайте также:  Антенна ds 500 для dvb t2 отзывы

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

Fix всегда округляет до нуля-Fix (3.5) = 3, Fix(-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 и т. д.

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

например If A > B Then MaxAB = A Else MaxAB = B примерно на 40 x быстрее, чем с помощью ExcelWorksheetFunction.Макс!—3—>

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

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

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

код только в GitHub:

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

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

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

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

округлить до числа значимых цифры

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

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

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

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

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

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

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

Ссылка на основную публикацию
Ноутбук пишет подождите и не включается
В данном материале мы постараемся ответить на вопрос, почему не включается ноутбук. Если не один из аппаратных процессов не активировался...
Недостаточно места в локальном хранилище html5
localstorage HTML Технология Web-хранилища позволяет хранить данные на стороне клиента в браузере и по своей сути очень похожа на cookie,...
Нельзя создавать переменные с пустым именем сбис
В ActionScript, равно как и в таких языках, как Pascal или JavaScript, объявить переменную можно, используя ключевое слово var: var...
Обнаружение ssdp что это за служба
SSDP Название Simple Service Discovery Protocol Уровень (по модели OSI) Сеансовый Семейство TCP/IP Порт/ID 1900/UDP Простой протокол обнаружения сервисов (англ....
Adblock detector