为什么将数字转换为字符可以改变数字?

Why can converting numbers to characters change the numbers?

我想这与 R 的数据结构有关,答案会很快,但我还没有找到答案,所以这里是:

as.character(9875987598759875)
[1] "9875987598759876"

library(crayon)
chr(9875987598759875)
[1] "9875987598759876"

toString(9875987598759875)
[1] "9875987598759876"

什么给了?我应该如何更安全地进行此转换?

.Machine$integer.max 表示 R 可以存储的最大整数是 2147483647(这可能 可以想象 因平台而异,但不太可能)。任何大于该值的数字都会自动转换为浮点数,并伴随 imprecision/round-off 错误。 (与 Python 不同,它会根据需要昂贵但神奇地将整数变量转换为 arbitrary-length 表示形式。)

如果 你安装了 bit64 包你可以使用 64 位整数,(大概)精确度高达

print(2^63-1,digits=22)
[1] 9223372036854775808

如果您开始一个字符串,您可以安全地round-trip转换为integer64并返回:

library(bit64)
cc <- "9875987598759875"
x <- as.integer64(cc)
identical(cc,as.character(x))
## [1] TRUE

但是,通常一旦您将一个数字作为常规数字读入 R 中就为时已晚。您可以将 colClasses="integer64"read.table()/read.csv()/等一起使用。以 integer64 的形式读取值;我相信 readrdata.table 中的 file-reading 函数也有 integer64 处理能力。

对于许多应用程序,如果您实际上不打算用这些 digit-strings 做任何数字操作,最安全和最简单的方法是确保首先将它们导入为 character .. .