高数字的打印值比应有的错误?

Moo*_*per 7 floating-point r

当在 RI 中打印大数字时,由于浮点魔法,预计会看到一个四舍五入的值。的确 :

options(scipen = 999)
x <- 10000000000000000000000000
x
#> [1]  9999999999999998758486016
Run Code Online (Sandbox Code Playgroud)

不过,我预计这个四舍五入的数字会四舍五入到自身,但看起来并非如此

x ==  9999999999999998758486016
#> [1] FALSE

9999999999999998758486016
#> [1]  9999999999999996611002368
Run Code Online (Sandbox Code Playgroud)

我手动找到了舍入到原始舍入值的最小数字

x ==  9999999999999998799999999
#> [1] FALSE

9999999999999998799999999
#> [1]  9999999999999996611002368

x ==  9999999999999998800000000
#> [1] TRUE

9999999999999998800000000
#> [1]  9999999999999998758486016
Run Code Online (Sandbox Code Playgroud)

虽然我们将不胜感激,但我有一个实际问题。我想设计一个忠实的dput()等价物,可以适用于任何数字。

要满足的约束是:x == as.numeric(my_deparser(x))

mydeparser()例如,如果可以返回“9999999999999998800000000”,我会很高兴,因为

10000000000000000000000000 == as.numeric("9999999999999998800000000")
#> [1] TRUE
Run Code Online (Sandbox Code Playgroud)

我已经尝试过format()dput()deparse()没有运气。

我怎样才能做到这一点?

我的会话信息:

R 版本 4.1.3 (2022-03-10) 平台:aarch64-apple-darwin20(64 位) 运行环境:macOS Monterey 12.0.1

小智 -2

我相信该scipen选项与值的打印方式有关,而不是它们的存储方式,因此当您这样做时:

x <- 10000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

该值实际上存储为 10000000000000000000000000,即使它打印为其他内容。所以

x == 10000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

应该返回 TRUE。

  • 确实,scipen 会影响值的打印方式,浮点数学的限制也限制了数字在内存中的存储方式。你对此无能为力。数字 10000000000000000000000000 不能完美地作为浮点数存储在内存中。如果您需要所有这些数字,您需要将其存储为字符串或其他内容。 (2认同)