为什么将数字转换为字符可以改变数字?
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
的形式读取值;我相信 readr
和 data.table
中的 file-reading 函数也有 integer64 处理能力。
对于许多应用程序,如果您实际上不打算用这些 digit-strings 做任何数字操作,最安全和最简单的方法是确保首先将它们导入为 character
.. .
我想这与 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
的形式读取值;我相信 readr
和 data.table
中的 file-reading 函数也有 integer64 处理能力。
对于许多应用程序,如果您实际上不打算用这些 digit-strings 做任何数字操作,最安全和最简单的方法是确保首先将它们导入为 character
.. .