Вопрос

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

Я что-то упускаю?

Это было полезно?

Решение

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

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

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

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

Другие советы

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

Вот список способов обойти это:

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

Будьте осторожны, функция VBA Round использует округление Banker, где она округляет .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 Round всегда округляет значение .5 в большую сторону.

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

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

Заявка.Раунд (58.55, 1)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top