Почему 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