19

JavaScript で、10 進数 ( など0.0002) を文字列 ( " など) として表される分数に変換する方法はあります2/10000"か?

呼び出された関数decimalToFractionがこの目的のために書かれている場合decimalToFraction(0.0002)、文字列を返します"2/10000"

4

12 に答える 12

22

Erik Garrison のfraction.jsライブラリを使用して、それ以上の小数演算を行うことができます。

var f = new Fraction(2, 10000);
console.log(f.numerator + '/' + f.denominator);

to do .003 できること

var f = new Fraction(.003);
console.log(f.numerator + '/' + f.denominator);
于 2013-02-09T01:28:43.607 に答える
8

「小数から小数へのjs」という用語を少しグーグルで検索すると、最初に次の結果が得られました。

http://wildreason.com/wildreason-blog/2010/javascript-convert-a-decimal-into-a-simplified-fraction/

それはうまくいくようです:

http://jsfiddle.net/VKfHH/

function HCF(u, v) { 
    var U = u, V = v
    while (true) {
        if (!(U%=V)) return V
        if (!(V%=U)) return U 
    } 
}
//convert a decimal into a 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 = 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;
        }
    }
    //if format of fraction is xx/xxx
    if (decimal.toString().length == 2 && 
            num.toString().length == 3) {
                //reduce by removing trailing 0's
        decimal = Math.round(Math.round(decimal)/10);
        num = Math.round(Math.round(num)/10);
    }
    //if format of fraction is xx/xx
    else if (decimal.toString().length == 2 && 
            num.toString().length == 2) {
        decimal = Math.round(decimal/10);
        num = Math.round(num/10);
    }
    //get highest common factor to simplify
    var t = HCF(decimal, num);

    //return the fraction after simplifying it
    return ((whole==0)?"" : whole+" ")+decimal/t+"/"+num/t;
}

// Test it
alert(fraction(0.0002)); // "1/5000"
于 2013-02-09T01:27:29.497 に答える
7

このサイトhttp://mathforum.org/library/drmath/view/51886.htmlを使用して関数を作成しましたが、記事に記載されているように、根号または円周率に対して不当な数が得られます。

それが役立つことを願っています。

function Fraction(){}
Fraction.prototype.convert = function(x, improper)
{
    improper = improper || false;
    var abs = Math.abs(x);
    this.sign = x/abs;
    x = abs;
    var stack = 0;
    this.whole = !improper ? Math.floor(x) : 0;
    var fractional = !improper ? x-this.whole : abs;
    /*recursive function that transforms the fraction*/
    function recurs(x){
        stack++;
        var intgr = Math.floor(x); //get the integer part of the number
        var dec = (x - intgr); //get the decimal part of the number
        if(dec < 0.0019 || stack > 20) return [intgr,1]; //return the last integer you divided by
        var num = recurs(1/dec); //call the function again with the inverted decimal part
        return[intgr*num[0]+num[1],num[0]]
    }
    var t = recurs(fractional); 
    this.numerator = t[0];
    this.denominator = t[1];
}

Fraction.prototype.toString = function()
{
    var l  = this.sign.toString().length;
    var sign = l === 2 ? '-' : '';
    var whole = this.whole !== 0 ? this.sign*this.whole+' ': sign;
    return whole+this.numerator+'/'+this.denominator;
}

//var frac = new Fraction()
//frac.convert(2.56, false)
//console.log(frac.toString())
//use frac.convert(2.56,true) to get it as an improper fraction

分子と分母のみを返す自己完結型の関数が必要な場合は、以下の関数を使用します。

var toFraction = function (dec) {
    var is_neg = dec < 0;
    dec = Math.abs(dec);
    var done = false;
    //you can adjust the epsilon to a larger number if you don't need very high precision
    var n1 = 0, d1 = 1, n2 = 1, d2 = 0, n = 0, q = dec, epsilon = 1e-13;
    while (!done) {
        n++;
        if (n > 10000) {
            done = true;
        }
        var a = parseInt(q);
        var num = n1 + a * n2;
        var den = d1 + a * d2;
        var e = (q - a);
        if (e < epsilon) {
            done = true;
        }
        q = 1 / e;
        n1 = n2;
        d1 = d2;
        n2 = num;
        d2 = den;
        if (Math.abs(num / den - dec) < epsilon || n > 30) {
            done = true;
        }
    }
    return [is_neg ? -num : num, den];
};
//Usage:
//var frac = toFraction(0.5);
//console.log(frac)
//Output: [ 1, 2 ]
于 2013-03-04T02:25:41.970 に答える
6

非常に古い質問ですが、誰かがこれを役に立つと思うかもしれません。反復的であり、再帰的ではなく、因数分解を必要としません

function getClosestFraction(value, tol) {
    var original_value = value;
    var iteration = 0;
    var denominator=1, last_d = 0, numerator;
    while (iteration < 20) {
        value = 1 / (value - Math.floor(value))
        var _d = denominator;
        denominator = Math.floor(denominator * value + last_d);
        last_d = _d;
        numerator = Math.ceil(original_value * denominator)

        if (Math.abs(numerator/denominator - original_value) < tol)
            break;
        iteration++;
    }
    return {numerator: numerator, denominator: denominator};
};
于 2014-05-28T20:32:21.327 に答える
2

幸いなことに、それは可能ですが、コードに変換する必要があります。

理由もなく 2.56 にしましょう。

数値 .56 の小数部分を使用する

.56 は 2 桁なので、.56 は 56/100 と書きます。

したがって、2 + 56/100 があり、分子と分母の両方を最大公約数(この場合は 4) で割ることにより、この分数を最小項に減らす必要があります。

したがって、この分数を最小項に換算すると、2 + 14/25 になります。

これらの 2 全体を加算するには、除数を掛けて 14 に加算します。

(2*25 + 14)/25 = 64/25

于 2013-02-09T01:34:20.367 に答える
0

このようなことを試しましたか?

var cnum = 3.5,
  deno = 10000,
  neww;
neww = cnum * deno;
while (!(neww % 2 > 0) && !(deno % 2 > 0)) {
  neww = neww / 2;
  deno = deno / 2;
}
while (!(neww % 3 > 0) && !(deno % 3 > 0)) {
  neww = neww / 3;
  deno = deno / 3;
}
while (!(neww % 5 > 0) && !(deno % 5 > 0)) {
  neww = neww / 5;
  deno = deno / 5;
}
while (!(neww % 7 > 0) && !(deno % 7 > 0)) {
  neww = neww / 7;
  deno = deno / 7;
}
while (!(neww % 11 > 0) && !(deno % 11 > 0)) {
  neww = neww / 11;
  deno = deno / 11;
}
while (!(neww % 13 > 0) && !(deno % 13 > 0)) {
  neww = neww / 13;
  deno = deno / 13;
}
while (!(neww % 17 > 0) && !(deno % 17 > 0)) {
  neww = neww / 17;
  deno = deno / 17;
}
while (!(neww % 19 > 0) && !(deno % 19 > 0)) {
  neww = neww / 19;
  deno = deno / 19;
}
console.log(neww + "/" + deno);

于 2014-05-11T11:05:31.537 に答える
0

私はポップヌードルが提案したことをしました、そしてここにあります

function FractionFormatter(value) {
  if (value == undefined || value == null || isNaN(value))
    return "";

  function _FractionFormatterHighestCommonFactor(u, v) {
      var U = u, V = v
      while (true) {
        if (!(U %= V)) return V
        if (!(V %= U)) return U
      }
  }

  var parts = value.toString().split('.');
  if (parts.length == 1)
    return parts;
  else if (parts.length == 2) {
    var wholeNum = parts[0];
    var decimal = parts[1];
    var denom = Math.pow(10, decimal.length);
    var factor = _FractionFormatterHighestCommonFactor(decimal, denom)
    return (wholeNum == '0' ? '' : (wholeNum + " ")) + (decimal / factor) + '/' + (denom / factor);
  } else {
    return "";
  }
}
于 2014-07-08T17:18:49.990 に答える
0

これは少し古いかもしれませんが、投稿されたコードは 0 の値で失敗します。そのエラーを修正し、更新されたコードを以下に投稿します

//function to get highest common factor of two numbers (a fraction)
function HCF(u, v) { 
    var U = u, V = v
    while (true) {
        if (!(U%=V)) return V
        if (!(V%=U)) return U 
    } 
}
//convert a decimal into a 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 = 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;
        }
    }
    //if format of fraction is xx/xxx
    if (decimal.toString().length == 2 && 
        num.toString().length == 3) {
            //reduce by removing trailing 0's
            // '
    decimal = Math.round(Math.round(decimal)/10);
    num = Math.round(Math.round(num)/10);
}
//if format of fraction is xx/xx
else if (decimal.toString().length == 2 && 
        num.toString().length == 2) {
    decimal = Math.round(decimal/10);
    num = Math.round(num/10);
}
//get highest common factor to simplify
var t = HCF(decimal, num);

//return the fraction after simplifying it

if(isNaN(whole) === true)
{
 whole = "0";
}

if(isNaN(decimal) === true)
{
    return ((whole==0)?"0" : whole);
}
else
{
    return ((whole==0)?"0 " : whole+" ")+decimal/t+"/"+num/t;
}
}
于 2015-07-10T01:40:44.560 に答える