Округлить число вниз

У меня есть numeric, как этот:

a <- -1.542045

И я хочу округлить их (или округлить abs) до 2 цифр после запятой. signif(a,3) округлит его в меньшую сторону и в результате даст мне 1,54, но для этого примера мне нужен результат -1.55.

Есть идеи?


person dan    schedule 01.10.2016    source источник


Ответы (3)


Я думаю, вы ищете floor(a * 100) / 100.

Быстрый тест

a <- c(-1.542045, 1.542045)
floor(a * 100) / 100
# [1] -1.55  1.54

Я только что заметил, что вы изменили свой вопрос 7 часов назад. Тогда мой ответ не делает именно то, что вы хотите (как я предполагаю, при «округлении вниз» вы всегда хотите округлить до -Inf). Но я обсуждал это в первой версии моего ответа. Теперь я собираюсь скопировать те, что относятся сюда.

  • С помощью sign(a) * ceiling(abs(a) * 100) / 100 вы можете округлить данные в сторону Inf для положительных значений и -Inf для отрицательных значений.
  • С помощью sign(a) * floor(abs(a) * 100) / 100 вы округляете как положительные, так и отрицательные значения до 0.

Быстрый тест

a <- c(-1.542045, 1.542045)

sign(a) * ceiling(abs(a) * 100) / 100
# [1] -1.55  1.55

sign(a) * floor(abs(a) * 100) / 100
# [1] -1.54  1.54
person Zheyuan Li    schedule 01.10.2016

Вы неправильно понимаете проблему. Если значение находится в -1,542045, оно всегда будет таким.

Теперь вы можете напечатать его с точностью до двух знаков после запятой или получить два знака после запятой:

> print(a, digits=3)
[1] -1.54
> format(a, digits=3)
[1] "-1.54"
> 

Если вы действительно хотите создать новое представление, вы можете:

> b <- trunc(a*1e2)*1e-2
> b
[1] -1.54
> 

Предпочтительным способом может быть

> b <- round(a, digits=2)
> b
[1] -1.54
> 
person Dirk Eddelbuettel    schedule 01.10.2016

Комбинация ceiling(), abs() и sign() может использоваться для округления абс числа, независимо от его знака. Такое округление до двух знаков после запятой может быть получено с помощью:

ceiling(abs(a)*100)/100*sign(a)

Пример:

a <- c(-1.542045, 1.542045)
ceiling(abs(a)*100)/100*sign(a)
#[1] -1.55  1.55
person RHertel    schedule 01.10.2016