处理 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
我有一个整数 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