Округление по гауссу в excel
Округление – экселевские причуды и несоответствия одной из «причуд» Excelя, которая может вызвать некоторую путаницу, если о ней не знаешь - это применение программой двух разных алгоритмов округления чисел. Далее обо всем по порядку.
Разный результат округления в Excel и VBA
Последствия существования «причуд» на рисунке ниже:
Как вы можете видеть на рисунке, результаты округления (и итоги) СУЩЕСТВЕННО ОТЛИЧАЮТСЯ!
Все что было сделано, так это округлено каждое из чисел, а затем суммирование их. В первом случае (столбец B) был округлен с помощью стандартной экселевской функции ОКРУГЛ, во втором случае (столбец C) – было использовано написанную в VBA функцию пользователя, которая, однако, не делает ничего иного, кроме как только округляя указанные числа, но используя доступную в VBA функцию Round(). Чтобы посмотреть соответствующий код макроса для пользовательской функции нажмите комбинацию горячих клавиш ALT+F11:
В 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 (при форматировании чисел с использованием этих функций в зависимости от выбранного формата также может происходить округление) используется стандартный алгоритм округления:
Следовательно, функция VBA Round (2,5, 0) вернет как результат 2, но уже функция FormatNumber (2,5, 0) вернет как результат 3. И где здесь логика?
Подытожим особенности округления чисел в Excel
Стоит помнить об этих различиях, создавая свои макросы, которые выполняют операции округления чисел. Как вы можете видеть, результат, возвращаемый макросом, может полностью отличаться от ожидаемого.
Как уже выше упоминалось, один алгоритм не является лучше или хуже другого. Каждый хорош в зависимости от применения. Стандартный алгоритм дает результаты, которые мы «ожидаем», в отличие от банковского алгоритма, который, помимо прочего, немного удивляет результатами.
Жаль, что эти два алгоритма были реализованы одновременно, кроме того, довольно хаотичным образом. Возможно было бы более естественным, если бы функция VBA Round() возвращала тот же результат, что и экселевская функция ОКРУГЛ (в конце концов, в английской версии Excelя, она называется также - ROUND).
По умолчанию число отображаемых знаков после запятой в Excel ограничено двумя, однако во время взаимодействия с таблицами пользователи изменяют эти настройки или в результате расчетов после запятой отображается больше цифр, чем это нужно. В таком случае на помощь приходят методы округления, о которых и пойдет речь в этой статье.
Вариант 1: Кнопки управления разрядностью
Кнопки разрядности, расположенные на главной вкладке Экселя в разделе «Число», отвечают за добавление или уменьшение количества знаков после запятой. Их использование – самый простой метод округления чисел, а весь процесс выглядит следующим образом:
Выделите ячейку с числом левой кнопкой мыши и используйте кнопки разрядности, расположенные в блоке «Число». Их внешний вид вы видите на следующем изображении. Кнопка со стрелкой вправо убирает лишние нули или другие цифры после запятой, что и нужно в данном случае.
На изображении ниже вы видите число с тысячными долями. Если нужно округлить подобное значение, вы можете использовать ту же кнопку, но учитывайте, что эта операция в Excel работает так же, как и в математике, то есть округление в большую или меньшую сторону зависит непосредственно от последнего числа.
Вариант 2: Параметры формата ячеек
В Excel поддерживаются разные форматы ячеек, что упрощает процесс выполнения математических операций и написания обычного текста. Редактирование количества нулей после запятой по большей части относится к числовому формату, что и является одним из методов округления. Его преимущество заключается в том, что вы можете убрать лишние знаки сразу для нескольких ячеек, предварительно выделив их.
Зажмите левую кнопку мыши и выделите все ячейки, которые хотите изменить. Затем щелкните по любой из них ПКМ.
Из появившегося контекстного меню выберите пункт «Формат ячеек».
На панели слева выделите пункт «Числовой» и измените значение «Число десятичных знаков» на оптимальное, самостоятельно вписав цифру в поле.
Обратите внимание на образец и убедитесь в том, что результат вас устраивает.
Вернитесь к таблице и проверьте изменения. Обратите внимание на то, что данная настройка работает и в обратную сторону, то есть позволяет добавить количество отображаемых знаков после запятой.
Вариант 3: Функция ОКРУГЛ
В завершение разберу необычный тип округления чисел в Экселе, который редко применяется, но может оказаться полезным в тех случаях, когда отредактировать исходную ячейку возможности нет. Данная функция работает примерно так же, как и настройка из предыдущего метода, но применяется в других ситуациях, в частности при переносе данных из таблицы.
Выберите пустую ячейку, в которой хотите получить запись округленного числа, после чего напишите там знак «=», объявив тем самым начало функции. Введите ОКРУГЛ или только начните записывать название функции, а затем выберите ее из списка.
Нажмите левой кнопкой мыши по исходной ячейке с числом для округления или введите ее номер самостоятельно.
Закройте первый аргумент, используя знак «;», после чего добавьте число, отвечающее за количество знаков после запятой, и закройте круглую скобку, закончив тем самым объявление формулы.
Обратите внимание на изображение ниже, где показан правильный синтаксис ОКРУГЛ.
В результате вы должны получить вывод с указанным количеством знаков после запятой и корректно работающим округлением в большую или меньшую сторону. В моем примере последнее число 4 – это значит, что оно просто убирается и сотая доля 6 остается неизменной. Если бы изначальное число было хотя бы 54,465, то вместо последней шестерки мы бы получили 7, как и в математике.
При использовании данного способа обратите внимание на то, что он также зависит от формата ячейки, в которой отображается результат функции. Если количество знаков после запятой не полное, вернитесь к Варианту 2 и в настройках формата добавьте одну или две разрядности для ячейки с формулой.
Читайте также: