【JS応用|初心者向け】JavaScriptで「余り」を正確に扱う!Math.fmodの考え方と実装術

なぜMath.fmodが必要なのか?

JavaScriptで数値の余りを求める際、多くの人は「%(剰余演算子)」を使います。しかし、JavaScriptの「%」は「整数」の計算には向いていますが、小数を含む計算では思わぬ誤差が生じることがあります。例えば、2.5を1.2で割った余りを求めたいとき、標準の演算子では正確な値が出ないことがあります。この「浮動小数点数の計算誤差」という課題を解決するために、数学的な剰余計算(fmod)の考え方が重要になります。

基礎知識:剰余演算とは何か

剰余演算とは、割り算をした後の「余り」を求める処理のことです。
通常、プログラミングにおける「%」は、被除数(割られる数)から、商の整数部分を引いて余りを求めます。しかし、コンピュータは小数を「2進数」で処理しているため、0.1や0.2といった単純な数値でも計算結果にわずかなズレが生じます。このズレを無視して計算を続けると、バグの原因になります。

実装:Math.fmodを自作する

JavaScriptには標準で「Math.fmod」という関数は存在しません。そのため、正確な剰余を求めるには、関数を自作するのが一般的です。以下のロジックを使うことで、小数を含めた正確な剰余計算が可能になります。

サンプルプログラム

以下のコードをブラウザのコンソールなどに貼り付けて、動作を確認してみてください。

// 正確な剰余を求める関数
function fmod(a, b) {
  // 割り算の結果から整数部分を取り出し、余りを計算する
  // (a / b) の商の整数部分を Math.trunc で取得し、元の値から引くことで余りを出す
  return Number((a - b  Math.trunc(a / b)).toPrecision(12));
}

// 実行例
const result = fmod(2.5, 1.2);
console.log("2.5 ÷ 1.2 の余りは: " + result); 

// 標準の%演算子との比較
console.log("標準の%演算子の場合: " + (2.5 % 1.2));
// %演算子だと 0.09999999999999998 といった誤差が出る場合があります

応用・注意点

1. 精度への配慮:上記のコードでは toPrecision(12) を使って、計算結果の桁数を調整しています。これは、JavaScriptの浮動小数点計算で発生しがちな「極小の誤差(例:0.00000000000004など)」を切り捨てるためのテクニックです。
2. ゼロ除算に注意:どのような計算でも同様ですが、割る数(b)に0を指定すると Infinity や NaN が返ります。実務で使用する際は、必ず引数が0でないかチェックする処理を入れるようにしましょう。
3. 使い分け:整数同士の計算であれば、標準の「%」演算子で十分です。小数を扱う計算(アニメーションの座標計算や、グラフ描画など)を行うときのみ、この自作関数を使うようにすると、パフォーマンスと正確性のバランスが取れます。

タイトルとURLをコピーしました