【问题标题】:Dealing with large integers in R在 R 中处理大整数
【发布时间】:2020-11-19 22:48:29
【问题描述】:

我有一个整数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 会更慢? )

【问题讨论】:

    标签: r data.table double bigint int64


    【解决方案1】:

    您将浮点数传递给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 == 18495608239531728,这会告诉我问题已经出现在前面的步骤中,因为这已经返回TRUE。感谢您的明确答复!
    猜你喜欢
    • 2010-10-31
    • 2014-04-23
    • 1970-01-01
    • 2017-09-24
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多