【问题标题】:Casting numeric from character imprecision从字符不精确中转换数字
【发布时间】:2013-11-01 07:55:52
【问题描述】:

as.numeric(as.character(1363821605424526000)) 产生1363821605424526080

为什么以及如何防止这种情况发生?

【问题讨论】:

  • 阅读浮点精度并学习help(".Machine")
  • @Roland 所以R中没有long可以使用?如果它是 data.frame 或 data.table 中的一个因素,它不会搞砸。仅从字符串或 read.csv 转换。
  • 不在基础 R 中(参见 help("typeof"))。可能有一些软件包可以提供帮助,当然,根据你想用这些数字做什么,你可以自己写一些东西。

标签: r


【解决方案1】:

一种解决方案是使用gmp 库(GNU Multiple Precision 库)来创建和执行大整数的基本算术...

require(gmp)
as.bigz("1363821605424526000")
#Big Integer ('bigz') :
#[1] 1363821605424526000

注意使用" 将数字四舍五入。这是为了保护它不被 R 解析为 numeric 数据类型,这当然不能在给定的数据结构中准确地表示这个数字。 "as.bigz 将其转换为 big integer 类型之前,让 R 将其视为字符变量。

示例

as.bigz("1363821605424526000") + 1
#Big Integer ('bigz') :
#[1] 1363821605424526001

as.bigz("1363821605424526000")^3
#Big Integer ('bigz') :
#[1] 2536720967038413127881466345733319337545403576000000000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 2014-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    相关资源
    最近更新 更多