Округление в R
Вчера мы столкнулись с расхождением в расчёте LT на одних и тех же данных в Power BI и R. После некоторого ресёрча я понял, что разница была в округлении. Функция
round()
в R округлила число 6.5 до 6, а Power BI - до 7.
Впервые для себя я узнал, что функция
round()
использует не привычный нам математический способ округления, а так называемый банковский. Вот в чём их отличия:
Банковское округление:
● Числа с десятичной частью .5 округляются до ближайшего чётного целого числа.
● Например, 2.5 округляется до 2, а 3.5 округляется до 4.
Математическое округление:
● Числа с десятичной частью .5 всегда округляются вверх.
● Например, 2.5 округляется до 3, а 3.5 тоже округляется до 4.
То есть если вы через
round()
попробуете округлить числа 2.5, 4.5, 6.5, то получите соответственно 2, 4, 6, а не ожидаемые 3, 5, 7.
Как оказалось, в базовом R вообще нет функции для математического округления. Поэтому если вдруг вам понадобится где-то использовать математическое округление, которое мы с вами учили в школе, придётся писать собственную функцию. Ниже приведена функция, которая математическим способом округляет дробные числа до целого:
round_math <- function(x) {
sign(x) * floor(abs(x) + 0.5)
}
Если вы хотите иметь возможность указать количество разрядов после запятой, то используйте эту функцию:
custom_round <- function(x, digits = 0) {
posneg <- sign(x) # Определяем знак числа
z <- abs(x) * 10^digits
z <- z + 0.5 # Добавляем 0.5 для округления вверх
z <- floor(z)
return(posneg * z / 10^digits)
}
#заметки_по_R