在R中从字符串转换为双精度时不同的数字

时间:2019-02-13 14:17:39

标签: r

在R 3.5.2上,并且尝试将字符串转换为double时,输出错误,

# this is just to avoid scientific notation. 
options(scipen=999)

temp <- "2671768011130961018032700237"
as.numeric(temp)
# and the output is, 
2671768011130961013860062868

as.double(temp)
# and the output is 
2671768011130961013860062868

as.numeric(temp) == 2671768011130961018032700237
# this returns true

print(.Machine$double.xmax)
# and to check the overflow case, this prints out 179769313486231570838400602864442228000008602082842266064064680402680408280648240046204888888288080622822420842246006644866884860462806420066668022046626024066662068886808602862886866800048228686262462640668044406484606206082824406288200264266406808068464046840608044222802268424008466606886862062820068082688

想不出任何可能导致此行为的原因。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

首先,请注意以下相等比较也返回了TRUE

as.numeric(temp) == 2671768011130961013860062868
[1] TRUE

这里的简短答案是R和其他大多数编程语言中的double / float精度不精确。以下两个比较均返回TRUE

as.numeric(temp) == 2671768011130961018032700237
as.numeric(temp) == 2671768011130961013860062868

这里可能发生的情况是,R仅比较了一个特定的有效数字,并且RHS上的两个数字都非常接近,因此在两种情况下比较都显示为TRUE

如果您要在此处查找“修复程序”,则需要使用精确的数字类型,例如整数。整数的问题在于您的值太大而无法存储,因此您真正需要的是与其他语言(例如Java)中的long等效。 Base R似乎不支持此功能,但是如果您read here,则可能会发现一些支持int64之类的自定义R软件包。