【发布时间】:2018-11-13 11:03:03
【问题描述】:
我想将我的多位数字向量转换为字符。我尝试了以下解决方案here,它适用于一个数字,但不适用于向量。没关系
options(digits=20)
options(scipen=99999)
x<-129483.19999999999709;format(round(x, 12), nsmall = 12)
[1] "129483.199999999997"
但事实并非如此。如何保持数字向量字符的数字精度?
> y <- c(129483.19999999999709, 1.3546746874,687676846.2546746464)
特别有问题的是687676846.2546746464 也试过了:
> specify_decimal(y, 12)
[1] "129483.199999999997" "1.354674687400" "687676846.254674673080"
> formatC(y, digits = 12, format = "f")
[1] "129483.199999999997" "1.354674687400" "687676846.254674673080"
> formattable(y, digits = 12, format = "f")
[1] 129483.199999999997 1.354674687400 687676846.254674673080
> sprintf(y, fmt='%#.12g')
[1] "129483.200000" "1.35467468740" "687676846.255"
> sprintf(y, fmt='%#.22g')
[1] "129483.1999999999970896" "1.354674687399999966075" "687676846.2546746730804"
预期结果:
[1] "129483.199999999997" "1.354674687400" "687676846.254674646400"
好像精度损失只发生一次,不会重复。
> require(dplyr)
> convert <- function(x) as.numeric(as.character(x))
> 687676846.2546746464 %>% convert
[1] 687676846.25467503
> 687676846.2546746464 %>% convert %>% convert %>% convert
[1] 687676846.25467503
这里我只有 5 位数的精度,但更成问题的是我无法事先知道我将获得什么精度..
【问题讨论】:
-
as.numeric(as.character(129483.123456789)) == 129483.123456789打印出TRUE。我认为这里有两个问题。首先,打印到控制台的内容可能无法反映潜在的精度。其次,您的样本数是浮点数,并且由于舍入误差可能存在一些问题。如果您查看我的示例编号,则四舍五入不会有问题。 -
好吧,我的号码呢?
-
字符串一定要显示所有数字
-
在这里查看:stackoverflow.com/questions/3443687/…,我认为这段代码可以满足您的需求:
x<-129483.19999999999709;format(round(x, 14), nsmall = 14) -
如果您这样做是因为您想将数字写入文本文件,以便在读取文本文件时可以恢复完全相同的数字,也许您可以将其转换为二进制表示(缩写为 hex)。
标签: r type-conversion precision