地板和天花板有2位或更多位数

Hei*_*kki 4 r significant-digits

可以使用signif以下结果将结果舍入为两位有效数字:

> signif(12500,2)
[1] 12000
> signif(12501,2)
[1] 13000
Run Code Online (Sandbox Code Playgroud)

但有一个同样方便的功能,如虚拟下方的功能signif.floorsignif.ceiling,这样我就可以得到两个或两个以上显著数字与地板或天花板?

> signif.ceiling(12500,2)
[1] 13000
> signif.floor(12501,2)
[1] 12000
Run Code Online (Sandbox Code Playgroud)

编辑:

现有signif函数使用负数和十进制数.

因此,可能的解决方案最好也可以使用负数:

> signif(-125,2)
[1] -120
> signif.floor(-125,2)
[1] -130
Run Code Online (Sandbox Code Playgroud)

和十进制数:

> signif(1.23,2)
[1] 1.2
> signif.ceiling(1.23,2)
[1] 1.3
Run Code Online (Sandbox Code Playgroud)

作为特例,0也应该返回0:

> signif.floor(0,2)
[1] 0
Run Code Online (Sandbox Code Playgroud)

sto*_*ged 7

我认为这种方法适用于所有类型的数字(即整数,负数,十进制).

地板功能

signif.floor <- function(x, n){
  pow <- floor( log10( abs(x) ) ) + 1 - n
  y <- floor(x / 10 ^ pow) * 10^pow
  # handle the x = 0 case
  y[x==0] <- 0
  y
}
Run Code Online (Sandbox Code Playgroud)

天花板功能

signif.ceiling <- function(x, n){
  pow <- floor( log10( abs(x) ) ) + 1 - n
  y <- ceiling(x / 10 ^ pow) * 10^pow
  # handle the x = 0 case
  y[x==0] <- 0
  y
}
Run Code Online (Sandbox Code Playgroud)

他们都做同样的事情.首先计算位数,然后使用标准floor/ ceiling功能.检查它是否适合您.

编辑1添加了x = 0Heikki评论中建议的案例处理程序.

编辑2再次跟随Heikki我添加了一些例子:

测试不同的值 x

# for negative values
> values <- -0.12151 * 10^(0:4); values
# [1]    -0.12151    -1.21510   -12.15100  -121.51000 -1215.10000
> sapply(values, function(x) signif.floor(x, 2))
# [1]    -0.13    -1.30   -13.00  -130.00 -1300.00
> sapply(values, function(x) signif.ceiling(x, 2))
# [1]    -0.12    -1.20   -12.00  -120.00 -1200.00

# for positive values
> sapply(-values, function(x) signif.floor(x, 2))
# [1]    0.12    1.20   12.00  120.00 1200.00
> sapply(-values, function(x) signif.ceiling(x, 2))
# [1]    0.13    1.30   13.00  130.00 1300.00
Run Code Online (Sandbox Code Playgroud)

测试不同的值 n

> sapply(1:5, function(n) signif.floor(-121.51,n))
# [1] -200.00 -130.00 -122.00 -121.60 -121.51
> sapply(1:5, function(n) signif.ceiling(-121.51,n))
# [1] -100.00 -120.00 -121.00 -121.50 -121.51
Run Code Online (Sandbox Code Playgroud)