Javaでプログラミングを行う際、数値を割った結果の「余り(剰余)」を求めたい場面は多々あります。

例えば、数値が奇数か偶数かを判定したり、特定の範囲内で数値を循環させたりする処理において、余りの計算は欠かせません。

Javaでは 「%」演算子を用いることで簡単に余りを取得できます が、負の数が絡む計算や浮動小数点数の扱いには注意が必要です。

本記事では、Javaにおける割り算の余りを求める基本的な方法から、負の数を扱う際の挙動、さらには実務で役立つ便利なメソッドや活用例までを詳しく解説します。

Javaにおける割り算の余り(剰余)演算の基本

Javaにおいて、割り算の余りを求めるために使用されるのが 「%(パーセント)」演算子 です。

これは「剰余演算子」とも呼ばれ、左辺の数値を右辺の数値で割ったときの余りを出力します。

基本的な書式は以下の通りです。

余り = 数値1 % 数値2;

例えば、10 % 3 という計算を行った場合、10を3で割ると商が3で余りが1となるため、結果は「1」になります。

この演算子は、整数型(int, long)だけでなく、浮動小数点型(float, double)でも使用することが可能です。

整数型(int, long)での剰余演算の実装方法

最も一般的なケースは、整数同士の計算です。

Javaの整数型で % 演算子を使用したサンプルコードを見てみましょう。

Java
public class Main {
    public static void main(String[] args) {
        int a = 10;
        int b = 3;
        
        // 10を3で割った余りを計算
        int result = a % b;
        
        System.out.println(a + " % " + b + " = " + result);
        
        // long型の場合
        long bigNum1 = 100L;
        long bigNum2 = 7L;
        long longResult = bigNum1 % bigNum2;
        
        System.out.println(bigNum1 + " % " + bigNum2 + " = " + longResult);
    }
}
実行結果
10 % 3 = 1
100 % 7 = 2

このように、計算結果は常に整数として得られます。

日常的なプログラミングにおいて、リストのインデックスを制御したり、特定の回数ごとに処理を実行したりする際によく利用されます。

浮動小数点型(double, float)での剰余演算

Javaの大きな特徴の一つとして、double 型や float 型といった浮動小数点数に対しても % 演算子が使える点が挙げられます。

C言語などの一部の言語では、浮動小数点数に対する剰余演算には専用の関数(fmod など)が必要ですが、Javaでは直感的に記述できます。

Java
public class FloatRemainder {
    public static void main(String[] args) {
        double d1 = 10.5;
        double d2 = 3.0;
        
        // 10.5を3.0で割った余り
        double result = d1 % d2;
        
        System.out.println(d1 + " % " + d2 + " = " + result);
    }
}
実行結果
10.5 % 3.0 = 1.5

ただし、浮動小数点演算には特有の 「丸め誤差」 が発生する可能性があるため注意が必要です。

厳密な小数の計算(金融系など)が必要な場合は、BigDecimal クラスの remainder メソッドを使用することを検討してください。

負の数が含まれる場合の注意点と計算規則

Javaの剰余演算で最も初心者が躓きやすいのが、負の数(マイナス)を含む計算です。

Javaの % 演算子は、厳密には「数学的な剰余(Modulo)」とは異なる挙動を示すことがあります。

符号の決定ルール

Javaにおける剰余演算の結果の符号は、「左側の項(被除数)の符号と同じになる」 という明確なルールがあります。

右側の項(除数)の符号は結果に影響しません。

以下の表に、符号の組み合わせによる結果の違いをまとめました。

余り(結果)備考
7 % 321両方正の場合
-7 % 3-2-1左辺が負なら結果も負
7 % -3-21右辺が負でも結果は正
-7 % -32-1両方負なら左辺に従い負

この仕様は、Javaにおける整数除算が「0の方向への切り捨て」を行うために定義されています。

具体的には、以下の数式が常に成立するように設計されています。

(a / b) * b + (a % b) == a

負の数における挙動の検証コード

実際にコードで確認してみましょう。

Java
public class NegativeRemainder {
    public static void main(String[] args) {
        System.out.println("-7 % 3  = " + (-7 % 3));
        System.out.println(" 7 % -3 = " + (7 % -3));
        System.out.println("-7 % -3 = " + (-7 % -3));
    }
}
実行結果
-7 % 3  = -1
 7 % -3 = 1
-7 % -3 = -1

このように、結果の符号は常に左辺の数値に依存します。

例えば、時計の針の計算やカレンダーの計算など、常に正の範囲で数値を循環させたい場合に負の数が入力されると、期待しない結果(負の余り)が返ってくるため、対策が必要になります。

Math.floorModメソッドによる数学的剰余の計算

Java 8以降では、負の数に対しても数学的な剰余(常に正の値を返すような処理)を簡単に計算できる Math.floorMod メソッドが導入されました。

前述した % 演算子が「0への切り捨て除算」に基づいているのに対し、Math.floorMod は「負の無限大への切り捨て除算」に基づいています。

Java
public class FloorModExample {
    public static void main(String[] args) {
        int a = -7;
        int b = 3;
        
        // 通常の%演算子
        int rem = a % b;
        // Math.floorModを使用
        int mod = Math.floorMod(a, b);
        
        System.out.println("-7 % 3 (演算子)      : " + rem);
        System.out.println("-7 % 3 (floorMod)   : " + mod);
    }
}
実行結果
-7 % 3 (演算子)      : -1
-7 % 3 (floorMod)   : 2

「常に 0 ~ (b-1) の範囲の結果が欲しい」 というケース(例:曜日の計算、配列のインデックス計算)では、Math.floorMod を使用するのが安全です。

実践的な活用シーン:奇数・偶数の判定から配列のループ処理まで

割り算の余りは、単なる計算以外にも多くのアルゴリズムで使用されます。

代表的な活用例をいくつか紹介します。

1. 奇数・偶数の判定

ある数値が2で割り切れるかどうかで、偶数か奇数かを判定できます。

Java
int number = 15;
if (number % 2 == 0) {
    System.out.println("偶数です");
} else {
    System.out.println("奇数です");
}

ただし、負の数も考慮する場合、number % 2 == 1 と書くと、負の奇数の場合に -1 となってしまい判定に失敗します。

「2で割り切れない(!= 0)」 という条件で判定するのが最も安全です。

2. 数値の範囲制限(ループ・循環処理)

例えば、3つの要素を持つ配列をループさせ、インデックスを 0, 1, 2, 0, 1, 2… と繰り返したい場合に有効です。

Java
for (int i = 0; i < 10; i++) {
    int index = i % 3;
    System.out.print(index + " ");
}
実行結果
0 1 2 0 1 2 0 1 2 0

3. 特定の回数ごとに処理を実行

「10回に1回だけログを出力する」といったバッチ処理などで利用されます。

Java
for (int i = 1; i <= 100; i++) {
    // 10の倍数のときだけ実行
    if (i % 10 == 0) {
        System.out.println(i + "個目の処理を完了しました");
    }
}

割り算の余りを扱う際の注意点とエラー回避

剰余演算を安全に使用するために、以下の2点には特に注意を払う必要があります。

0での割り算(ArithmeticException)

通常の割り算と同様に、% 演算子の右辺に 0 を指定すると、実行時に java.lang.ArithmeticException: / by zero が発生します。

Java
int x = 10;
int y = 0;
// int result = x % y; // ここでランタイムエラーが発生

プログラムの中で変数を除数(割る数)として使う場合は、必ず事前に 0 でないことをチェックするか、例外処理を記述してください。

パフォーマンス上の考慮

剰余演算は、加減算に比べるとCPUの計算コストが若干高い処理です。

非常に大規模なループ内で数億回実行されるようなケースでは、ビット演算(特定のケースのみ)などで代用されることもありますが、通常のアプリケーション開発においては % 演算子をそのまま使って問題ありません。

まとめ

Javaにおける割り算の余り(剰余)を求める方法は、非常にシンプルですが奥が深いテーマです。

  • 基本は「%」演算子を使用する
  • 結果の符号は左辺(被除数)に依存するため、負の数が含まれる場合は注意が必要。
  • 負の数で数学的な剰余を得たい場合は Math.floorMod() を活用する
  • 0での割り算は例外が発生するため、必ずチェックを行う。

これらのルールを正しく理解しておくことで、条件分岐やデータのグルーピング、ループ制御といった様々なロジックを正確に実装できるようになります。

Javaの基礎的な演算子ではありますが、特に負の数の挙動については、この機会にしっかりとマスターしておきましょう。