即使在 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_else
和 data.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"
我想 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_else
和 data.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"