R:十进制上限
R: decimal ceiling
我需要 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非常相似。
@42- 评论中的回答似乎太有用了,不能只留在评论中,因此这个 wiki-post.
您可以创建自己的函数并改编 floor
和 ceiling
函数,添加一个 level
选项来模仿 round
函数的 digits
参数像这样:
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
这个答案没有在之前的答案中评论过的问题,但遗憾的是它是基于 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
}
我想定义一个与@42 非常相似的函数。我不想用你想要的小数位数来定义 floor 函数,而是想定义 sig figs 的数量:
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 需要正整数作为输入。就像提示者猜测的那样,我找到最高位的位置,将小数位移动到适当的楼层,然后移动小数位,使输入的最高位与输出相同。
我需要 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非常相似。
@42- 评论中的回答似乎太有用了,不能只留在评论中,因此这个 wiki-post.
您可以创建自己的函数并改编 floor
和 ceiling
函数,添加一个 level
选项来模仿 round
函数的 digits
参数像这样:
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
这个答案没有在之前的答案中评论过的问题,但遗憾的是它是基于 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
}
我想定义一个与@42 非常相似的函数。我不想用你想要的小数位数来定义 floor 函数,而是想定义 sig figs 的数量:
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 需要正整数作为输入。就像提示者猜测的那样,我找到最高位的位置,将小数位移动到适当的楼层,然后移动小数位,使输入的最高位与输出相同。