Java Tips | 基本ユーティリティ:Math.floorMod()

Web APP Java
スポンサーリンク
スポンサーリンク

Math.floorMod()とは何か

Javaで業務システムを開発していると、「割り算の余り」を求める処理が頻繁に登場します。

例えば、

  • ページ送り処理
  • 曜日計算
  • 循環処理(ループ処理)
  • グループ分け
  • ハッシュ値計算
  • 座標変換処理

などです。

通常であれば、

%
Java

演算子を利用します。

10 % 3
Java

しかしJavaには、

Math.floorMod()
Java

という特別な剰余(余り)計算メソッドがあります。

このメソッドは、負の数を含む計算でも数学的に一貫した余りを返します。

特にMath.floorDiv()とセットで利用される重要なユーティリティです。

まずは剰余(余り)を理解しよう

剰余とは割り算したときの余りです。

例えば、


10 ÷ 3 = 3 余り 1

になります。

Javaでは次のように書きます。

// 余り
int result = 10 % 3;

System.out.println(result);
Java

実行結果

1

これが剰余です。

Math.floorMod()の基本構文

基本構文は非常にシンプルです。

Math.floorMod(被除数, 除数)
Java

実際に確認してみましょう。

// 余り計算
int result =
        Math.floorMod(
                10,
                3
        );

// 表示
System.out.println(result);
Java

実行結果

1

正の数同士なら通常の%演算子と同じ結果になります。

ステップバイステップで理解する

ステップ1:割られる数を用意する

// データ番号
int recordNo = 17;
Java

ステップ2:割る数を用意する

// グループサイズ
int groupSize = 5;
Java

ステップ3:Math.floorMod()を実行する

// 余り計算
int remain =
        Math.floorMod(
                recordNo,
                groupSize
        );
Java

ステップ4:結果を確認する

// 出力
System.out.println(remain);
Java

実行結果

2

17 ÷ 5 は余り2になります。

通常の%演算子との違いはどこにあるのか

ここが最大のポイントです。

正の数同士では違いがありません。

// 通常
System.out.println(
        7 % 3
);
Java

結果

1

Math.floorMod()でも同じです。

// floorMod
System.out.println(
        Math.floorMod(
                7,
                3
        )
);
Java

結果

1

違いが出るのは負の数です。

負の数の場合を見てみよう

通常の%演算子


// 通常剰余
System.out.println(
        -7 % 3
);
Java

実行結果

-1

Math.floorMod()


// floorMod
System.out.println(
        Math.floorMod(
                -7,
                3
        )
);
Java

実行結果

2

結果が大きく異なります。

なぜ結果が違うのか

Math.floorMod()は数学的な剰余を求めます。

実は、


-7 = (-3 × 3) + 2

が成立しています。

また、


Math.floorDiv(-7, 3)
Java

の結果は、

-3

です。

そのため、


余り = 2

になります。

Math.floorMod()はMath.floorDiv()と整合性を保つように設計されています。

通常の剰余との比較表

計算式%演算子floorMod
7 % 311
-7 % 3-12
7 % -31-2
-7 % -3-1-1

負数が絡む場合に大きな違いが出ます。

Math.floorDiv()との関係を理解しよう

この2つはセットで使われます。

// 商
int quotient =
        Math.floorDiv(
                -7,
                3
        );

// 余り
int remainder =
        Math.floorMod(
                -7,
                3
        );

System.out.println(quotient);
System.out.println(remainder);
Java

実行結果


-3
2

次の式が成立します。


被除数 =
floorDiv × 除数
+
floorMod

これは数学的に非常に重要な性質です。

実務でよくある利用例① 曜日計算

曜日は循環データです。

// 曜日番号
int day = -1;

// 0~6へ変換
int weekDay =
        Math.floorMod(
                day,
                7
        );

System.out.println(weekDay);
Java

実行結果

6

負数でも正しく曜日を計算できます。

実務でよくある利用例② 循環インデックス

// 現在位置
int index = -1;

// 配列サイズ
int size = 10;

// 補正
int actualIndex =
        Math.floorMod(
                index,
                size
        );

System.out.println(actualIndex);
Java

実行結果

9

循環配列でよく利用されます。

実務でよくある利用例③ グループ分け

// ID
int employeeId = 123;

// グループ番号
int groupNo =
        Math.floorMod(
                employeeId,
                5
        );
Java

データ分散処理などで利用されます。

実務でよくある利用例④ ローテーション処理

// 当番番号
int dutyIndex = -2;

// 人数
int memberCount = 8;

// 正しい位置
int actualPosition =
        Math.floorMod(
                dutyIndex,
                memberCount
        );
Java

シフト管理システムなどで利用できます。

特に重要:負数インデックス問題を解決できる

実務で非常によくあるケースです。

例えば、

-1 % 10
Java

の結果は、

-1

になります。

これを配列の添字として利用するとエラーになります。

しかし、

Math.floorMod(-1, 10)
Java

なら、

9

になります。

循環処理では非常に便利です。

long型にも対応している

Math.floorMod()はlong型にも対応しています。

// long版
long result =
        Math.floorMod(
                -100L,
                7L
        );

System.out.println(result);
Java

大規模システムでも利用できます。

実務で使えるテンプレート集

基本テンプレート


// 剰余
int remain =
        Math.floorMod(
                value,
                divisor
        );
Java

循環インデックステンプレート


// 配列位置補正
int index =
        Math.floorMod(
                currentIndex,
                array.length
        );
Java

曜日計算テンプレート


// 0~6へ変換
int day =
        Math.floorMod(
                offset,
                7
        );
Java

floorDiv併用テンプレート


// 商
int quotient =
        Math.floorDiv(a, b);

// 余り
int remainder =
        Math.floorMod(a, b);
Java

情報セキュリティの観点から見る重要性

Math.floorMod()自体はセキュリティ機能ではありません。

しかしデータ分析やログ解析では正しい数値処理が重要です。

特に、

  • アクセスログ分析
  • イベント分散処理
  • 統計処理
  • データシャーディング
  • ハッシュ計算補助

などでは、負数を含む剰余計算の正しさが重要になります。

Math.floorMod()を利用することで、数学的に一貫した処理を実現できます。

初心者が覚えておくべき重要ポイント

  • 数学的な剰余を求めるメソッドである
  • 正の数では%演算子とほぼ同じである
  • 負の数で結果が変わる
  • Math.floorDiv()とセットで利用する
  • 循環処理で非常に便利である
  • 曜日計算などで活躍する
  • int型とlong型に対応している

まとめ

Math.floorMod()は、数学的に正しい剰余を求めるためのJava標準メソッドです。

  • 余りを計算できる
  • 負の数でも一貫した結果を返す
  • Math.floorDiv()との整合性が取れている
  • 循環インデックス処理に便利である
  • 曜日計算やシフト計算に活用できる
  • 数学的に正しいロジックを実装できる
  • Java開発者が知っておきたい数値演算ユーティリティである

特に業務システムやアルゴリズム開発では、負数を含む剰余計算が必要になることがあります。そのような場面でMath.floorMod()を利用すると、通常の%演算子よりも数学的に一貫した結果を得られます。また、Math.floorDiv()とセットで理解することで、より高度な数値処理やデータ処理を安全に実装できるようになるでしょう。

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