使用JavaScript/jQuery计算分数
假设1杯等于2.36分升。 我想要一个函数,它可以输入一个十进制数,表示dl中的cup/cups,并以分数形式输出cup/cups的数量 这就是我到目前为止所得到的:使用JavaScript/jQuery计算分数,javascript,jquery,Javascript,Jquery,假设1杯等于2.36分升。 我想要一个函数,它可以输入一个十进制数,表示dl中的cup/cups,并以分数形式输出cup/cups的数量 这就是我到目前为止所得到的: var dl = 2.36; cupToFraction(.78); // 1/3 cup cupToFraction(2.36); // 1 cup cupToFraction(4.72); // 2 cups cupToFraction(8.26); // 3 1/2 cups fun
var dl = 2.36;
cupToFraction(.78); // 1/3 cup
cupToFraction(2.36); // 1 cup
cupToFraction(4.72); // 2 cups
cupToFraction(8.26); // 3 1/2 cups
function cupToFraction (cup) {
var deci = (cup / dl);
alert(deci);
}
一种选择是使用连分数获得有理近似值:
var dl = 2.36;
function cupToFraction (cup) {
var deci = (cup / dl);
var integerPart = Math.floor(deci);
deci -= integerPart;
deci = 1 / deci;
var c = [];
// Tune these parameters for how far you want the continued fraction to go
// 3 means at most 3 terms; 10 means no terms higher than 10.
for (let i = 0; i < 3 && deci < 10; ++i) {
let f = Math.floor(deci);
c.push(f);
deci -= f;
deci = 1/deci;
}
if (c.length === 0) return [integerPart, 0, 1];
var p = 1, q = c.pop();
while (c.length > 0) {
var int = c.pop();
p = q*int + p;
[p, q] = [q, p];
}
// Handle case like cupToFraction(2.35)
if (p === q) { p = 0; integerPart++; }
return [integerPart, p, q];
}
var-dl=2.36;
功能杯萃取(杯){
var deci=(杯/分升);
var integerPart=数学楼层(分贝);
deci-=整数部分;
分贝=1/分贝;
var c=[];
//调整这些参数,以确定您希望连分数走多远
//3表示最多3个术语;10表示不超过10个术语。
对于(设i=0;i<3&&deci<10;++i){
设f=数学楼层(分贝);
c、 推(f);
deci-=f;
分贝=1/分贝;
}
if(c.length==0)返回[integerPart,0,1];
var p=1,q=c.pop();
而(c.长度>0){
var int=c.pop();
p=q*int+p;
[p,q]=[q,p];
}
//把手盒状吸盘(2.35)
如果(p==q){p=0;integerPart++;}
返回[integerPart,p,q];
}
它返回一个数组,其元素为
整数部分、分子、分母。例如,cupToFraction(8.26)
为31/2
提供[3,1,2]
。我相信该算法可以进行更优化,但目前必须这样做。一个可能更健壮、更简单的解决方案使用:
功能杯萃取(杯){
返回新分数(cup).div(2.36).simplify(0.1).toFraction(true);
}
铜萃取(.78);//"1/3"
铜萃取(2.36);//"1"
铜萃取(4.72);//"2"
铜萃取(8.26);//"3 1/2"
一切如您所愿,但输入的数字将使用Farey序列转换为分数(非常稳定),您可以通过类似的分数:
cupToFraction(“32/12”);//"1 1/3"
精度可以通过参数simplify(eps)
来控制。我做了一些小改动,以便能够运行非分数数字。。非常感谢,这太棒了!