为什么 R 用大数字显示错误数字?

Why does R display wrong number with large numbers?

当我在 R 中将大量数字作为对象保存时,保存了错误的数字?这是为什么?

options("scipen"=100, "digits"=4)
num <- 201912030032451613 

num
#> [1] 201912030032451616

reprex package (v0.2.1.9000)

创建于 2019-12-12

正如@Roland 所说,这是一个浮点问题(关于浮点数的维基百科页面与任何内容一样好)。稍微拆开它,R 有 specific 整数格式,但它仅限于 32 位整数:

> str(-2147483647L)
 int -2147483647
> str(2147483647L)
 int 2147483647
> str(21474836470L)
 num 21474836470
Warning message:
non-integer value 21474836470L qualified with L; using numeric value 

因此,当 R 获取您的数字时,它会将其存储为浮点数而不是整数。浮点数的存储精度有限,通常只有大约 17 位有效数字。因为您的号码的有效数字多于精度损失。丢失最小数字的精度通常对计算机算术无关紧要,但如果你的大数字是某种密钥(或日期戳),那么你就会遇到更多麻烦。 bit64 包在设计时就考虑到了这种用例,或者您可以将其作为字符串导入,具体取决于您想要做什么。