即使在 R 中有 0 和没有小数点,也有三个有效的小数位

Have three significant decimal digits even with 0 and no decimals in R

我想 return 所有小数点后有 3 位有效数字的数字,即使第三位数字为零。

例如假设我有

x <- 0.8579
y <- 0.21
z <- 924894.2595

那么如果我这样做

x <- signif(x, digits=3) 
y <- signif(y, digits=3) 
z <- signif(z, digits=3) 

我得到x = 0.857 y=0.21 and z=924894

这几乎就是我想要的。我真正想要的是

x = 0.857 y=0.210 and z=924894

我试过使用

format(round(x,3), digits=3)

但是这样做我得到了

x = 0.857 y=0.210 and z=924894.259

所以现在我对 z 有疑问,因为我实际上想要 z=924894

有人知道解决我的问题的答案吗?

不过,您预期的 924894 的“signif digits”不正确,因为它显示的是 6 signif digits。如果你想“违反”那个技术细节,那么也许

vec <- c(0.857,0.210,924894.259)
dig <- 3
sprintf(paste0("%0.", ifelse(vec >= (10^dig), "0", dig), "f"), vec)
# [1] "0.857"  "0.210"  "924894"

(我在这里对 ifelse 有点草率:从技术上讲,"0" 是字符,dig 是 numeric/integer。一般来说,应该不鼓励这样做,并且 dplyr::if_elsedata.table::fifelse 强制执行 。这可能意味着 ifelse 表达式中的 return 值可能是 character(如果任何东西都足够大)或 integer/numeric(如果没有东西足够大);幸运的是,paste0 将完全相同地处理它,所以斜率class-这里不精确是可以接受的。如果我想彻底,我会用 as.character(dig) 代替。)


另一种方法,它对每个数字的表观规模分别做出反应:

vec <- c(0.857,0.210,924894.259,1)
sprintf(paste0("%0.", pmax(floor(3 - log(abs(vec)+0.001, 10)), 0), "f"), vec)
# [1] "0.857"  "0.210"  "924894" "1.00"