当在 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。