我将四舍五入以使除一位以外的所有数字均为零。因此,举例来说,如果我有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
。
答案 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.06
。 round_sigfigs(2341, 2)
是2300
,四舍五入到第二位。
内置的R函数signif
自动处理此问题。