2016-04-20 3 views
3

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

Почему функция VBA Round работает должным образом?

Sub roundingResults() 
    Range("A1") = 123456.705 
    Debug.Print "Approach #1 " & Round(Range("A1").Value, 2) 
    Debug.Print "Approach #2 " & Application.Round(Range("A1").Value, 2)  
End Sub 

Выход

Approach #1 123456.7 
Approach #2 123456.71 
+0

См [ЗДЕСЬ] (http://mathforum.org/library/drmath/view/58972.html) для лучшего объяснения, но суть в том, что существует два способа округлить число, заканчивающееся на 5. Первый подход использует четное. Поэтому, если вы изменили номер на '123456.715', оба вернули' 123456.72'. Вторая оценка использует 5 в качестве разделителя. –

ответ

1

Там не совсем правильный ответ за то, как округлить. Различия связаны с тем, как обрабатывать значения, которые попадают точно в середину. Application.Round всегда будет округлять в этом случае. например 0,5 округляется до 1,0. VBA.Round будет привязывать разрыв до ближайшего четного числа

1.5-->2 
2.5-->2 
3.5-->4 

и пр. Это один из способов нескольких способов уменьшения смещения, присущего всегда округлению.

Кроме того, если интересно, есть довольно широкое обсуждение Округление в this Wikipedia article

+0

Ударьте меня на 20 секунд. –

+1

@ScottCraner :-) Округление - интересная тема для меня. Существует много разных способов использования tiebreaking в дополнение к тем, которые используются в функциях Excel и VBA. –

+0

Дополнительная информация. VBA использует округление банкира http://www.xbeat.net/vbspeed/i_BankersRounding.htm. Тот же метод в .net http://stackoverflow.com/questions/311696/why-does-net-use-bankers-rounding-as-default – Jules

Смежные вопросы