/ / jqueryで小数または分数を16に丸める-jquery、math、decimal、rounding、fractions

jquery、jquery、数学、小数点、四捨五入、小数点以下を四捨五入した小数または分数を16番目に丸める

私はこのコードを使用して、小数を分数に変換しています:

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;
}

これは機能しますが、解決できないように見えるいくつかの問題があります。最初に、10進数の後に長い(または無限の)数字がある数字はページを強制終了するため、使用して入力を手動で制限する必要がありました。 .round() それを利用する前に。次に、端数の値を最も近い16に丸める必要があります。

2日間Googleを探し回っているときに気付いたので、これは特にトリッキーな問題だと思いますが、うまくいけば誰かがそれを行う方法を知っているはずです。

回答:

回答№1は1

試してください:

Math.round( number * 16) / 16

例えば:

Math.round(32578.8252789345798345987683476983476908347569873490867309487609875690860*16)/16

与える

32578.8125

これは= 32578 + 13/16


回答№2の場合は0

分数の値を最も近い16に丸める必要があります

間の数値を含む配列を作成してみてください 1/16 そして 1 、using 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>