我正在使用此代码将小数转换为分数:
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位。
我意识到这是一个特别棘手的问题,因为我已经发现在谷歌周围拖了两天,但希望有人知道该怎么做。我愿意接受任何解决方案。
答案 0 :(得分:1)
尝试:
Math.round( number * 16) / 16
例如:
Math.round(32578.8252789345798345987683476983476908347569873490867309487609875690860*16)/16
给出
32578.8125
这是= 32578 + 13/16
答案 1 :(得分:0)
我需要能够将分数值四舍五入到最接近的第16个
尝试使用1/16
,1
循环,Array.prototype.reduce()
,for
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>