在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
想不出任何可能导致此行为的原因。任何帮助表示赞赏。
答案 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软件包。