防止R舍入

Mic*_*ael 3 r rounding-error

如何防止R四舍五入?

例如,

> a<-893893084082902
> a
[1] 8.93893e+14
Run Code Online (Sandbox Code Playgroud)

我在那里失去了很多信息.我尝试过signif(),它似乎没有做我想要的.

提前致谢!

(这是由于我的一名学生试图确定以每秒数字计算到数千万亿的时间所需的时间)

Jos*_*ich 15

它不是四舍五入的; 它只是打印大(或小)数字的默认格式.

a <- 893893084082902
> sprintf("%f",a)
[1] "893893084082902.000000"
Run Code Online (Sandbox Code Playgroud)

请参阅?options全局解决方案的"数字"部分.


JD *_*ong 6

要绕过R的整数限制,可以使用Rmp的gmp包:http://cran.r-project.org/web/packages/gmp/index.html

我在玩Project Euler挑战并需要进行分解时发现了这个包.但它也提供了大整数的功能.

编辑: 看起来这个问题并不是关于大整数的问题,而是关于舍入问题.但是对于下一个这样来的太空旅行者来说,这是一个大整数数学的例子gmp:

尝试使用基数R乘以1e500*1e500:

> 1e500 * 1e500
[1] Inf
Run Code Online (Sandbox Code Playgroud)

所以要对你做同样的gmp事情首先需要创建一个它调用的大整数对象bigz.如果你试图传递as.bigz()一个真正大数字的int或double,它将无法工作,因为我们使用的全部原因gmp是因为R不能保持这么大的数字.所以我们传递一个字符串.所以下面的代码以字符串操作开始,以创建大字符串:

library(gmp)
o <- paste(rep("0", 500), collapse="")
a <- as.bigz(paste("1", o, sep=""))
mul.bigz(a, a)
Run Code Online (Sandbox Code Playgroud)

如果你这么倾向,你可以算零.


Tom*_*mmy 5

这将显示所有数字的更多数字:

options(digits=15)
Run Code Online (Sandbox Code Playgroud)

或者,如果您只想要它a

print(a, digits=15)
Run Code Online (Sandbox Code Playgroud)