Функция раунда в Excel, функция листа против VBA - PullRequest
3 голосов
/ 05 ноября 2008

У меня было приложение для возврата наиболее близких совпадений к определенным значениям в большом кластере значений (как в моем предыдущем вопросе ), и я выбрал решение VBA. Хотя в ходе использования указанного приложения я заметил, что результаты для значения 0,5 были неверными. Я использовал функцию округления VBA, которая, как я обнаружил, возвращает 0 для округления 0,5 до целого числа, тогда как функция округления листа возвращает 1. Как ни странно, функция округления VBA возвращает 2 для 1,5. Мне пришлось заменить функцию листа вместо VBA.

Я что-то упустил?

Ответы [ 3 ]

3 голосов
/ 05 ноября 2008

Это известная проблема. Функция VBA Round () использует округление по Банкеру, а функция ячейки электронной таблицы - арифметическое округление. Проверьте детали здесь:

PRB: функция округления отличается в VBA 6 и электронной таблице Excel

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

Банковское округление всегда округляет 0,5 до ближайшего даже числа и является стандартным в учете, поэтому Excel работает именно так Арифметическое округление округляет 0,5 до следующего числа.

2 голосов
/ 05 ноября 2008

Ответ на вопрос полностью здесь и скопирован здесь (с разрешения автора:):

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

Round (12.55, 1) would return 12.6 (rounds up) 
Round (12.65, 1) would return 12.6 (rounds down) 
Round (12.75, 1) would return 12.8 (rounds up)   

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

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

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

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

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

2 голосов
/ 05 ноября 2008

Вы можете обвинить Microsoft в этом: http://support.microsoft.com/kb/194983

Вот список способов обойти это: http://www.excelforum.com/excel-programming/401104-worksheet-rounding-vs-vba-rounding.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...