将数字四舍五入到最接近的数字,所有数字均等于零,但第一位数字

时间:2019-02-13 16:06:16

标签: r

我将四舍五入以使除一位以外的所有数字均为零。因此,举例来说,如果我有2341,则将四舍五入为2000,然后向上舍入为3000;对于324,我将四舍五入为300,然后向上舍入400。有没有一种方法可以舍入数字,以便除第一个数字外所有数字都为零? 理想情况下,这也应该适用于少量数字,因此0.0568会四舍五入为0.05,再向上舍入为0.06

类似roundUp <- function(x) 10^ceiling(log10(x))的函数将舍入到10的最接近的幂[如果将ceiling的{​​{1}}更改为更低的幂),但是在这种情况下,floor将被舍入到324的位置,而我会将其四舍五入到1000并向下舍入到400

3 个答案:

答案 0 :(得分:1)

我认为以下函数可以满足您的所有示例的需要,并且也为负值:

special_round <- function(x, type)
{
  z = floor(log10(abs(x)))
  y = 10^z
  res = x/y
  if(type == "up" )
  { 
    res <- ceiling(res)
  }
  if(type == "down")
  {    
    res <- floor(res)
  }
  return(res*y)
}

答案 1 :(得分:1)

在@Michael Lugo回答之后,但使其能够处理负数(例如@Stefan Zechner回答),并且还进行了上下舍入处理,我做了以下工作。

round_to_zeros = function(x, num.sig.figs = 1, round.down = TRUE){
  initial.x <- as.numeric(x)
  if(x == 0){return(0)}
  if(x < 0){x <- (-1*x)}
  power_of_ten = floor(log(x, 10))

  number_down <- round(floor(x/10^power_of_ten), num.sig.figs-1)*10^power_of_ten
  number_up   <- round( x /10^power_of_ten, num.sig.figs-1)*10^power_of_ten

  if(initial.x < 0){
    if(round.down==TRUE){return(-1*number_up)} else {return(-1*number_down)} }

  if(round.down==TRUE){return(number_down)} else {return(number_up)}
}

它向上和向下取整,并处理负数和正数。

答案 2 :(得分:0)

此功能会将x舍入为num.sig.figs有效数字。 (您想舍入到1个有效数字。)

round_sigfigs = function(x, num.sig.figs = 1){
  power_of_ten = floor(log(x, 10))
  return(round(x/10^power_of_ten, num.sig.figs-1)*10^power_of_ten)
}

例如:round_sigfigs(2341, 1)2000,而round_sigfigs(0.0568, 1)0.06round_sigfigs(2341, 2)2300,四舍五入到第二位。

内置的R函数signif自动处理此问题。