2016-02-27 49 views
1

16日我使用此代码小数转换成分数:小数四舍五入或分数与jQuery的

Number.prototype.fraction=fraction; 
     function fraction(decimal){ 
      if(!decimal){ 
       decimal=this; 
      } 
      whole = String(decimal).split('.')[0]; 
      decimal = parseFloat("."+String(decimal).split('.')[1]); 
      num = "1"; 
      for(z=0; z<String(decimal).length-2; z++){ 
       num += "0"; 
      } 
      decimal = parseInt(decimal*num); 
      num = parseInt(num); 
      for(z=2; z<decimal+1; z++){ 
       if(decimal%z==0 && num%z==0){ 
        decimal = decimal/z; 
        num = num/z; 
        z=2; 
       } 
      } 
      return ((whole==0)?"" : whole+" ")+decimal+"/"+num; 
     } 

这工作,但有一些问题,我似乎无法化解。首先,小数点后的长数字(或无限数字)会导致页面丢失,所以我必须在使用.round()之前手动限制输入。其次,我需要能够将分数值舍入到最接近的16位。

我意识到这是一个特别棘手的问题,因为我发现周围的同时谷歌曳两天,但我希望有人知道如何做到这一点。我愿意接受任何解决方案。

回答

1

尝试:

Math.round(number * 16)/16 

例如:

Math.round(32578.8252789345798345987683476983476908347569873490867309487609875690860*16)/16 

32578.8125 

是= 32578 + 13/16

+0

也许我错误地将你的回合误解为了最接近的16位。如果是这样,我会删除我的答案。 –

+0

啊哈!我明白现在如何运作。我想我会以某种方式需要操纵分数部分,但这是非常容易的。谢谢! – Eckstein

+0

不,你没有,这是完美的。 – Eckstein

0

我需要哪些以能够分数值舍入到最接近的16

尝试创建1/161之间包含数字的阵列,使用Array.prototype.reduce()for环,Math.min()Math.round()

var s = 1/16, d = []; 
 

 
for (var i = s, n = 0; i < 1; i += s, n++) { 
 
    d[n] = i 
 
} 
 

 
function f16(num) { 
 
    return num 
 
    .split(".") 
 
    .reduce(function(a, b, index, arr) { 
 
     var curr = +("." + b), j; 
 
     for (var i = 0; i < d.length; i++) { 
 
     if (Math.min(curr, d[i]) === curr) { 
 
      j = " " + (i + 1) + "/" + (d.length + 1); 
 
      break; 
 
     } 
 
     }; 
 
     return j === 0 ? +a + Math.round(curr) : a + j; 
 
    }) 
 
} 
 

 
document.onchange = function(event) { 
 
    document.querySelector("output").innerHTML = f16(event.target.value) 
 
}
<input type="number" step="0.1" /> 
 
<output></output>