分数2/4
があるとすると、に減らすことができます1/2
。
削減できるJavaScript関数はありますか?
// 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]
いいえ、でも自分で簡単に書くことができます。基本的に、分数の上部と下部を「最大公約数」で割る必要があります...これはユークリッドのアルゴリズムから計算できます。
詳細については、こちらをお読みください: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));
分数を減らすには、分子と分母を最大公約数で割ります。PhrogzとDavidはすでにソースコードを提供しています。
ただし、分数を処理するためのjavascriptライブラリを検索している場合は、ここから選択できます。
これは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.
これが古い投稿であることは知っていますが、受け入れられた回答を再帰関数ではなくループソリューションに変換しました。これにより、メモリ効率が大幅に向上し、おそらくはるかに高速になります(メモリスタック操作や実行呼び出しは必要ありません)。
function reduce(numerator, denominator) {
var a = numerator;
var b = denominator;
var c;
while (b) {
c = a % b; a = b; b = c;
}
return [numerator / a, denominator / a];
}
メモリフットプリントは、わずか5つの数値構造体と単純なループです。
すでに答えがあることは知っていますが、10進数を分数に変換して分数を減らすものを探していたときに見つけたJSライブラリを共有したいと思います。
ライブラリはFraction.jsを呼び出します。これは私にとって非常に役立ち、時間と労力を大幅に節約しました。それが他の誰かに非常に役立つことを願っています!
これは、ECMAScript6reduceを使用した再帰関数です。余りが小さすぎない限り、ほとんどの分数で機能します。0は、[1.2、2.4、12、24]のような配列で機能するように再定義されました。ChromeとIEEdgeでテストしたので、他のブラウザやアップグレードでは動作が異なる場合があります。したがって、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();
ここでMDNreduceまたは詳細情報を検索してください。
「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));
Janに加えて、私は彼の機能を次のように変更します。
function reduce(numerator,denominator){
var roundNr = 0
if(numerator >= denominator) {
roundNr = Math.floor(numerator / denominator);
numerator -= (roundNr * denominator);
}
var gcd = function gcd(a,b){
return b ? gcd(b, a%b) : a;
};
gcd = gcd(numerator,denominator);
return {roundNr: roundNr, numerator: numerator/gcd, denominator: denominator/gcd}; }
これは、分子>=分母の場合にもラウンド数を返します。