当字符串转换为数值时,带有 numeric 的 as.character() 会失去精度

as.character() with numeric loses precision when a string is transformed into numeric

提问人:Davide 提问时间:11/19/2021 最后编辑:Davide 更新时间:11/22/2021 访问量:64

问:

在 R 中,我想运行以下代码:

str <- "2811.1019192874087"
val <- as.numeric(str)
str2 <- as.character(val)
print(str2)
print(val)

它打印:

"2811.10191928741"
 2811.102

但我想要:

"2811.1019192874087"
 2811.102

简而言之,我希望 as.character() 的精度不会丢失。我已经尝试使用where是我选择的数字,但这只会改变输出,而不会改变值本身。我也尝试使用.这个系统似乎可以工作,但不幸的是,输出是类型而不是类型。options(digits = x)xtrimws(format(round(x, k), nsmall=k))characternumeric

如果我在 Java 中做同样的事情,它就可以正常工作。我运行以下代码:

String str = "2811.1019192874087";
double val = Double.parseDouble(str);
String str2 = String.valueOf(val);
System.out.println(str2);
System.out.println(val);

它打印:

2811.1019192874087
2811.1019192874087

如何在 R 中解决问题?非常感谢

Java R 精度 浮点精度

评论

1赞 Limey 11/19/2021
这并不是说“失去”精度,使用的默认格式是四舍五入它传递的值。 打印,表明精度由 保持。as.numericprintsprintf("%4.13f", val)[1] "2811.1019192874087"as.numeric()
0赞 jogo 11/19/2021
en.wikipedia.org/wiki/Floating-point_arithmetic
0赞 Davide 11/19/2021
@jogo查看我的标签
1赞 user20650 11/19/2021
print(val, digits=15)显示更多数字(我不明白这一点:“options(digits = ...只更改打印值,而不更改值本身“),因为使用更多数字会显示 R 在打印时默认截断为 7 的值)
1赞 koolmees 11/19/2021
假设您的原始数据是一个字符串,您可以选择在句点之前和之后测量 nchar,并将其粘贴到您的 sprintf 语句中,如下所示: .它使代码动态化,尽管您显然放弃了可读性str2 <- sprintf(paste0("%", paste0(unlist(lapply(strsplit(str, "\\."), nchar)), collapse = "."), "f"), val)

答: 暂无答案