R 函数将十进制数转换为具有指定分母的分数

R 函数将十进制数转换为具有指定分母的分数,r,decimal,fractions,R,Decimal,Fractions,假设我有一个小数列表 x <- c(0.55, 0.246, 0.767) 我遇到过这样的情况,效果很好。然而,我想知道是否有一个函数可以做到这一点 frac.fun <- function(x, den){ dec <- seq(0, den) / den nams <- paste(seq(0, den), den, sep = "/") sapply(x, function(y) nams[which.min(abs(y - dec))]) }

假设我有一个小数列表

x <- c(0.55, 0.246, 0.767)
我遇到过这样的情况,效果很好。然而,我想知道是否有一个函数可以做到这一点

frac.fun <- function(x, den){ 
  dec <- seq(0, den) / den 
  nams <- paste(seq(0, den), den, sep = "/") 
  sapply(x, function(y) nams[which.min(abs(y - dec))]) 
} 

frac.fun(x, 10) 
#[1] "6/10" "2/10" "8/10"

frac.fun以防您需要使用上述函数的更简化版本

f = function(x, den) {paste0(round(x * den), "/", den)}
x <- c(0.55, 0.246, 0.767)
f(x, 10)

[1] "6/10" "2/10"  "8/10" 
f=function(x,den){paste0(round(x*den),“/”,den)}

与x相关的可能重复的
MASS::partitions
很可能就是您所需要的。然而,如果你需要取整到一个特定的分母,你也可以尝试
paste0((x%/%(1/den))+(x%%(1/den)>(1/2/den)),“/”,den)
@akrun我看到了,但是我希望它总是在10个分母中。此函数很好,因为它提供了最大分母,但不提供最小分母。不过还是谢谢你。那要理想得多。谢谢。如果您决定使用类似的方法,请确保您对近似值感到满意。我的意思是0.55不等于6/10。分母越大,就越接近实际值。作为0.55=55/100。是的,我在考虑这一点。当小数位数和/或100的概念更难理解/形象化时,可使用它进行教学。非常感谢。
f = function(x, den) {paste0(round(x * den), "/", den)}
x <- c(0.55, 0.246, 0.767)
f(x, 10)

[1] "6/10" "2/10"  "8/10"