私はこのコードを使用して、小数を分数に変換しています:
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>