5

如何防止 R 舍入?

例如,

> a<-893893084082902
> a
[1] 8.93893e+14

我在那里丢失了很多信息。我已经尝试过 signif() 并且它似乎没有做我想要的。

提前致谢!

(这是由于我的一个学生试图确定以每秒一个数字数到万亿需要多长时间的结果)

4

3 回答 3

21

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

a <- 893893084082902
> sprintf("%f",a)
[1] "893893084082902.000000"

?options有关全局解决方案,请参阅“数字”部分。

于 2011-07-12T19:12:25.100 回答
7

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

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

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

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

> 1e500 * 1e500
[1] Inf

所以要对你做同样的事情,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)

如果你愿意的话,你可以数零。

于 2011-07-12T19:12:37.003 回答
6

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

options(digits=15)

或者,如果您只想要它a

print(a, digits=15)
于 2011-07-12T19:18:01.453 回答