web-dev-qa-db-ja.com

分数を減らすJavaScript関数はありますか

分数2/4があるとすると、1/2に減らすことができます。

削減できるJavaScript関数はありますか?

39
dave
// Reduce a fraction by finding the Greatest Common Divisor and dividing by it.
function reduce(numerator,denominator){
  var gcd = function gcd(a,b){
    return b ? gcd(b, a%b) : a;
  };
  gcd = gcd(numerator,denominator);
  return [numerator/gcd, denominator/gcd];
}

reduce(2,4);
// [1,2]

reduce(13427,3413358);
// [463,117702]
78
Phrogz

いいえ、でも自分でかなり簡単に書くことができます。基本的に、分数の上部と下部を「最大公約数」で割る必要があります...これはユークリッドのアルゴリズムから計算できます。

詳細については、こちらをお読みください: http://www.jimloy.com/number/euclids.htm

編集:

コード(誰もがそれをしているように見えるので、これは再帰を使用しませんが)

var FractionReduce = (function(){
    //Euclid's Algorithm
    var getGCD = function(n, d){
        var numerator = (n<d)?n:d;
        var denominator = (n<d)?d:n;        
        var remainder = numerator;
        var lastRemainder = numerator;

        while (true){
            lastRemainder = remainder;
            remainder = denominator % numerator;
            if (remainder === 0){
                break;
            }
            denominator = numerator;
            numerator = remainder;
        }
        if(lastRemainder){
            return lastRemainder;
        }
    };

    var reduce = function(n, d){
        var gcd = getGCD(n, d);

        return [n/gcd, d/gcd];
    };

    return {
            getGCD:getGCD,
            reduce:reduce
           };

}());

alert(FractionReduce.reduce(3413358, 13427));
10
david

分数を減らすには、分子と分母を最大公約数で割ります。 PhrogzとDavidはすでにソースコードを提供しています。

ただし、分数を処理するためのjavascriptライブラリを検索している場合は、ここから選択できます。

  1. Fraction.js
  2. Math.Rational
  3. Ratio.js
  4. Rational.js

Ratio.js を使用した例を次に示します。

var a = Ratio(2,4);

a.toString() == "2/4";
a.simplify().toString() == "1/2";    // reduce() returns a clone of the Ratio()
a.toString() == "2/4"; // Ratio functions are non-destructive.
5
Larry Battle

すでに答えがあることは知っていますが、何かを探していたときに見つけたJSライブラリを共有して10進数を分数分数を減らす

ライブラリは Fraction.js を呼び出します。これは私にとって本当に役に立ち、多くの時間と作業を節約しました。それが他の誰かに非常に役立つことを願っています!

1
Jabel Márquez

これは、ECMAScript 6reduceを使用した再帰関数です。余りが小さすぎない限り、ほとんどの分数で機能します。 0は、[1.2、2.4、12、24]のような配列で機能するように再定義されました。 ChromeおよびIE Edgeでテストしたので、他のブラウザーやアップグレードでは動作が異なる可能性があります。したがって、floatの配列で動作するはずです。

 Array.prototype.gcd = function () {
   if (this.length === 0)
     return null;
   return this.reduce((prev, curr) => {
     if (curr <= 1.00000000001e-12)
       return prev
     else
       return [curr, prev % curr].gcd();
    });
  }

  var reducedValueGCD = [1.2, 2.4, 12, 24, 240].gcd();

MDNリデュースまたは詳細情報を検索 ここ

0
RetroCoder

「2/4」のような文字列の端数を減らし、文字列の端数として出力します。

function reduce([numerator, denominator]){
  for (let i = numerator; i > 0; i--) {
    if(!(numerator % i) && !(denominator % i)){
      return [(numerator / i), (denominator / i)];
    }
  }
}

function reduceFraction(string){
  return reduce(string.split('/').map(n => +n)).join('/');
}

one = '2/4';
two = '20/200';
three = '330/2050';

console.log('2/4 reduced to', reduceFraction(one));
console.log('20/200 reduced to', reduceFraction(two));
console.log('330/2050 reduced to', reduceFraction(three));
0
SoEzPz