Почему R раунд не работает вокруг больших чисел
Мне нужна функция R, которая всегда возвращает такое же количество цифр после десятичной точки независимо от того, насколько велика аргумент. Я попробовал round(), но это не работает. Вот мой пример:
Rweb:> round(111234.678912,4) # expect 111234.6789
[1] 111234.7
Rweb:> round(111234.678912/10,4) # expect 11123.4679
[1] 11123.47
Rweb:> round(111234.678912/100,4) # expect 1112.3468
[1] 1112.347
Rweb:> round(111234.678912/1000,4)
[1] 111.2347
Rweb:> round(111234.678912/10000,4)
[1] 11.1235
Он работает, если аргумент находится в экспоненциальном формате, но мне нужно работать с числами в плавающем формате.
Ответы
Ответ 1
Он округляет число до правильного числа цифр. Однако R имеет ограничения на количество цифр, отображаемых на очень больших количествах. То есть, эти цифры есть, они просто не показаны.
Вы можете видеть это так:
> round(111234.678912,4)
[1] 111234.7
> round(111234.678912,4) - 111234
[1] 0.6789
Вы можете использовать formatC
для отображения его с любым количеством цифр:
> n = round(111234.678912,4)
> formatC(n, format="f")
[1] "111234.6789"
> formatC(n, format="f", digits=2)
[1] "111234.68"
Как поясняет @mnel, вы также можете указать количество отображаемых цифр (в том числе слева от десятичной точки), используя options
:
> options(digits=6)
> round(111234.678912,4)
[1] 111235
> options(digits=10)
> round(111234.678912,4)
[1] 111234.6789
Ответ 2
Для всех, кто, как и я, думал, что вопрос будет о бонусах:-), вот это, чтобы обдумать:-)
Rgames> bfoo<-mpfr("1.234545678909887665453421")
Rgames> bfoo
1 'mpfr' number of precision 84 bits
[1] 1.234545678909887665453421
Rgames> round(bfoo,10)
1 'mpfr' number of precision 84 bits
[1] 1.23454567889999999999999999`
Ответ 3
let x is a number with big decimal places.
x<-1111111234.6547389758965789345
Здесь x - число с большими десятичными знаками, вы можете форматировать десятичные знаки как пожелаете.
Таким образом, мы хотим взять до 8 десятичных знаков этого числа.
x<-c(1111111234.6547389758965789345)
y<-formatC(x,digits=8,format="f")
[1] "1111111234.65473890"
Здесь формат = "f" дает число в обычных десятичных разрядах, скажем, xxx.xxx. Но если вы хотите получить целое число из этого объекта x, вы используете Формат = "d"
Ответ 4
О "bignums", @Carl Witthoft:
Спасибо, Карл.... Я думал о бонусах, когда читал. Вы уверены, что
проблема с округлением?
Смотрите это:
> mpfr("1.2345456789", prec=84)
1 'mpfr' number of precision 84 bits
[1] 1.23454567889999999999999999
и обратите внимание, что Rmpfr (я - сопровождающий) остается рядом с базовой библиотекой MPFR. Для round()
я применил логику/принцип f (x), возвращающий результат с той же формальной точностью, что и x. Если вы хотите округлить с уменьшенной формальной точностью, вы можете удобно использовать roundMpfr()
:
> roundMpfr(bfoo, 32)
1 'mpfr' number of precision 32 bits
[1] 1.2345456788