Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript/jQuery计算分数_Javascript_Jquery - Fatal编程技术网

使用JavaScript/jQuery计算分数

使用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

假设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

  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)

来控制。我做了一些小改动,以便能够运行非分数数字。。非常感谢,这太棒了!