防止R舍入

时间:2011-07-12 19:09:15

标签: r rounding-error

如何防止R四舍五入?

例如,

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

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

提前致谢!

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

3 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:6)

要绕过R的整数限制,可以使用Rmp的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)

如果您愿意,可以计算零。

答案 2 :(得分:3)

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

options(digits=15)

或者,如果您只想要a

print(a, digits=15)