我需要ceiling
和floor
函数的十进制变体。像signif
这样的东西,可以选择在哪个方向进行舍入。
例如,我需要将数字2.63转换为2.7,而不是3(ceiling
)或2.6(signif(2.63,2)
)。
我能想到的唯一解决方法是乘以10,然后取ceiling
再除以10。
ceiling(2.63*10)/10
我敢肯定,必须有一个更优雅的解决方案。
我的问题与this one非常相似。
答案 0 :(得分:12)
@ 42-评论中的答案似乎太有用了,不能留在评论中,因此这个wiki-post。
您可以创建自己的功能并调整floor
和ceiling
功能,添加level
选项以模仿此digits
功能的round
参数:
floor_dec <- function(x, level=1) round(x - 5*10^(-level-1), level)
ceiling_dec <- function(x, level=1) round(x + 5*10^(-level-1), level)
<强>示例:强>
# floor
floor_dec(1.259, 2)
[1] 1.25
floor_dec(1.9, 0)
[1] 1
floor_dec(29, -1)
[1] 20
floor_dec(1.251, 2)
[1] 1.25
floor_dec(1.2, 0)
[1] 1
floor_dec(23, -1)
[1] 20
# ceiling
ceiling_dec(1.259, 2)
[1] 1.26
ceiling_dec(1.9, 0)
[1] 2
ceiling_dec(29, -1)
[1] 30
ceiling_dec(1.251, 2)
[1] 1.26
ceiling_dec(1.2, 0)
[1] 2
ceiling_dec(23, -1)
[1] 30
答案 1 :(得分:0)
此答案在先前答案的注释中没有问题,尽管可悲的是基于OP中不需要的答案:
customCeiling <- function(x, Decimals=1) {
x2<-x*10^Decimals
ceiling(x2)/10^Decimals
}
customFloor <- function(x, Decimals=1) {
x2<-x*10^Decimals
floor(x2)/10^Decimals
}
答案 2 :(得分:0)
我想定义一个与@42 非常相似的函数。我想定义 sig figs 的数量,而不是用你想要的小数位数来定义 floor 函数:
floor_dec <- function(x, sigDig=1) {
mostSig = ceiling(log10(abs(x)))
floor(x*10^(sigDig-mostSig))*10^-(sigDig-mostSig)
}
> floor_dec(21.259, 4)
[1] 21.25
> floor_dec(21.259, 3)
[1] 21.2
> floor_dec(21.259, 2)
[1] 21
> floor_dec(21.259, 1)
[1] 20
> floor_dec(.259, 4)
[1] 0.259
> floor_dec(.259, 3)
[1] 0.259
> floor_dec(.259, 2)
[1] 0.25
> floor_dec(.259, 1)
[1] 0.2
> floor_dec(1.2, 0)
[1] 0
> floor_dec(23, -1)
[1] 0
请注意,sigDif 需要正整数作为输入。就像提示者猜测的那样,我找到最高有效数字的位置,移动适当楼层的小数位,然后移动小数位,使输入的最高有效数字与输出相同。