【JavaScript】分数を約分する方法
更新日:2023/07/29
JavaScriptで分数を約分する方法をお伝えします。
約分とは
まずは約分について、言葉の定義を確認してみます。
分数の約分とは分母と分子の共通の約数、すなわち公約数でそれぞれを割ることで元の分子・分母の値を小さくすることを指します。
例えば、1030は、次のように約分できます。
これだけではなくて、次のような約分もできます。
それぞれ、約分する余地が残っていますね。
約分をする余地が無くなるまで約分すると、次のようになります。
このような、約数が1のみの分数を既約分数と呼びます。
一般的に約分は、既約分数になるまで約分することを指すことが多いです。
約分するプログラムコード
分母と分子を与えられたと仮定して、既約分数になるまで約分するプログラムコードを作成してみます。
分母と分子は、小数値も受け付けます。
次の手順で処理していきます。
- 分子と分母を整数化
- 分子と分母の最大公約数を求める
- 分子と分母を最大公約数で割る
最大公約数は公約数を全て掛け算したものと等しいです。
そのため、公約数で何度も割るよりも、最大公約数で1回割る方が効率的です。
// 二つの値を約分する
const reduction = (value1,value2) =>{
// 小数以下の桁数取得
const digit1 = getdecimalPrecision(value1);
const digit2 = getdecimalPrecision(value2);
if( digit1 === false || digit2 === false ) return false;
// 符号取得
const sign = [Math.sign( value1 ),Math.sign( value2 )];
// 整数化
const digit = 10 ** Math.max( digit1 , digit2 );
const v1 = Math.abs( Math.round( value1 * digit ) );
const v2 = Math.abs( Math.round( value2 * digit ) );
// 公倍数を求める
const gcd = greatestCommonDivisor2( v1 , v2 );
// 約分して返す
return [ Math.round( v1 / gcd ) * sign[0] , Math.round( v2 / gcd ) * sign[1] ];
}
// 最大公約数を求める https://note.affi-sapo-sv.com/js-greatest-common-divisor.php
const greatestCommonDivisor2 = ( value1 , value2 )=>{
let r , a = value1 , b = value2;
do{
r = a % b;
a = b;b = r;
}while( r !== 0 );
return a;
};
// 小数部の桁数を求める https://note.affi-sapo-sv.com/js-get-fractional-digits.php
const getdecimalPrecision = (number,significant_digits=6) =>{
// 数値文字列かどうかのチェック
if( typeof number !== "number" ) return false;
const f = number.toFixed(significant_digits).split(".")[1];
if( f === undefined || f.length === 0) return 0;
// 後方の"0"を取り除いた桁数取得
return f.length - ["1",...f].reverse().findIndex( e=>e!="0");
}
分数の約分は関数reduction()で行います。
計算上は分子と分母の関係性に依存しないので、関数reduction()の二つ引数はどちらが先でも大丈夫です。
計算結果は、二つの引数の約分結果を配列で返します。
最大公約数と小数以下の桁数の取得については他のページで解説しているので、そちらを読んでみてください。
関数を実行してみます。
console.log( reduction( 10 , 30 ) ); // 結果: [ 1, 3 ]
console.log( reduction( 10.5 , 30.5 ) ); // 結果: [ 21, 61 ]
console.log( reduction( 0.1234 , 5.214 ) ); // 結果: [ 617, 26070 ]
一つ目と二つ目は、上手く約分できています。
三つ目は、合っているか分かりにくいですね。
まずは、結果の 617 と 26070 の最大公約数を確認しみます。
次のツールで確認できるので、やってみてください。
ツールを使うと最大公約数が1であることがわかるので、既約分数になっていることがわかります。
元の値を整数化したものと約分結果を、それぞれ分子を分母で割ってみます。
console.log( 1234 / 52140 ); // 結果: 0.02366705024932873
console.log( 617 / 26070 ); // 結果: 0.02366705024932873
同じ結果になりました。
上手く約分できているようですね。
更新日:2023/07/29
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。