处理 R 中的大整数

Dealing with large integers in R

我有一个整数 18495608239531729,从某种意义上说,它给我带来了 data.table 包的一些麻烦,当我从存储这么大数字的 csv 文件中读取数据时,它将它们存储为integer64

现在我想像 dt[big_integers == 18495608239531729] 那样过滤我的 data.table,这给我一个数据类型不匹配(比较 integer64 和 double)。

我想既然 18495608239531729 是一个很大的数字,我也许应该使用 bit64 包来处理数据类型。

所以我做到了:

library(bit64)
as.integer64(18495608239531729)

> integer64
> [1] 18495608239531728

我认为 integer64 应该能够毫无问题地处理更大的值?

所以我做到了:

as.integer64(18495608239531729) == 18495608239531729

> [1] TRUE

那时我更开心,但后来我想,为什么不试试:

as.integer64(18495608239531728)

> integer64
> [1] 18495608239531728

这让我也尝试了:

as.integer64(18495608239531728) == as.integer64(18495608239531729)

> [1] TRUE

在不损失精度的情况下,在 R 中处理大数字的正确方法是什么?从技术上讲,在我的例子中,我不对所述列进行任何数学运算,所以我可以将其视为字符向量(尽管我担心这会占用更多内存,并且加入 r data.table 会是更慢?)

您正在将浮点数传递给 as.integer64。精度损失已经存在于您对 as.integer64:

的输入中
is.double(18495608239531729)
#[1] TRUE

sprintf("%20.5f", 18495608239531729)
#[1] "18495608239531728.00000"

传递一个字符串来避免:

library(bit64)
as.integer64("18495608239531729")
#integer64
#[1] 18495608239531729