Java | 基礎文法:算術演算子

Java Java
スポンサーリンク

算術演算子の全体像

Java の算術演算子は、足し算・引き算・掛け算・割り算・余り(剰余)を行うための基本ツールです。整数と小数で挙動が異なる点、型の自動拡張やオーバーフロー、ゼロ割りの結果など、初心者が最初につまずきやすいポイントを押さえると一気に安定します。まずは「式の型」「演算の優先順位」「括弧で明示」の3つを頭に置くと安全です。


基本の演算子と使い方

足し算・引き算・掛け算・割り算・余り

int a = 7;
int b = 3;

System.out.println(a + b); // 10
System.out.println(a - b); // 4
System.out.println(a * b); // 21
System.out.println(a / b); // 2 (整数どうしの割り算は小数切り捨て)
System.out.println(a % b); // 1 (余り)
Java

割り算は「オペランドの型」で結果が決まります。整数どうしは切り捨て、小数が混ざれば小数計算になります。余り(%)は「割り算の余り」ですが、負の数が絡むと符号の扱いに注意が必要です(後述)。

浮動小数点の割り算

double x = 7;
double y = 3;
System.out.println(x / y); // 2.3333333333333335
Java

小数計算は丸め誤差を伴います。結果の表示だけ丸めたいなら printf を使い、計算自体を厳密にしたい(金額など)なら BigDecimal を選びます。


重要ポイントの深掘り:整数割り算・ゼロ割り・型昇格

整数割り算の「切り捨て」

System.out.println(5 / 2);      // 2
System.out.println(5 / 2.0);    // 2.5
System.out.println((double)5 / 2); // 2.5
Java

整数どうしの割り算は常に切り捨て。小数が欲しいなら、どちらか一方を double(または float)に変換します。

ゼロ割りの挙動(int と double の違い)

int p = 1;
// System.out.println(p / 0);   // ArithmeticException(例外で落ちる)

double q = 1.0;
System.out.println(q / 0);       // Infinity
System.out.println(0.0 / 0.0);   // NaN(数ではない)
Java

整数のゼロ割りは例外で停止します。小数のゼロ割りは IEEE 754 に従い InfinityNaN になります。入力チェックでゼロを事前に弾くのが基本です。

型昇格(より広い型へ広がる)

int i = 2;
long L = 3L;
long r = i * L;   // 結果は long に昇格
Java

式は「より広い型」に昇格します。意図しない型混在を避けるため、変数とリテラルの型は揃えて書くと安全です。


重要ポイントの深掘り:余り演算と負の数、オーバーフロー

余り(%)と負の数の符号

System.out.println(7 % 3);   // 1
System.out.println(-7 % 3);  // -1(左オペランドの符号に引っ張られる)
System.out.println(7 % -3);  // 1
Java

Java の % は「剰余」で、商の定義により負の結果が出ます。「インデックスの循環」などで負を避けたい場合は正規化します。

int mod = ((-7 % 3) + 3) % 3; // 2(0..2 の範囲へ正規化)
Java

オーバーフロー(例外にならない罠)

int max = Integer.MAX_VALUE;      // 2147483647
int overflow = max + 1;           // -2147483648(循環)
System.out.println(overflow);
Java

整数は範囲を超えても例外になりません。大きな加算・乗算・累積は long を選ぶ、あるいは境界チェックを入れて守ります。


インクリメント・デクリメントと複合代入

++ と — の前置・後置

int n = 5;
System.out.println(++n); // 6(前置:先に増える)
System.out.println(n++); // 6(後置:使った後に増える、n は 7 になる)
System.out.println(n);   // 7
Java

「前置は先に変更、後置は使用後に変更」。式の評価順序に影響するため、複雑な式で使うのは避け、単独で使うと誤解が減ります。

複合代入で簡潔に

int x = 10;
x += 3;   // x = x + 3
x -= 2;   // x = x - 2
x *= 4;   // x = x * 4
x /= 3;   // x = x / 3(整数なら切り捨て)
x %= 5;   // x = x % 5
Java

読みやすさと一貫性が上がります。ただし「意味が伝わるか」を基準に使い分けましょう。


演算の優先順位と括弧

優先順位の基本と安全な書き方

掛け算・割り算は足し算・引き算より先に評価されます。% も同列で「乗除剰余」グループです。読み手に意図を伝えるため、括弧で明示するのがプロの書き方です。

int r1 = 1 + 2 * 3;      // 7
int r2 = (1 + 2) * 3;    // 9(意図を括弧で明示)
Java

「計算順序が誤解されうる箇所」は躊躇なく括弧を付けます。可読性は最優先です。


実用例で身につける

例 1: 平均と切り上げ(整数→小数)

public class AverageRoundUp {
    public static void main(String[] args) {
        int total = 17;
        int count = 5;
        double avg = total / (double) count;         // 3.4
        int ceil = (int) Math.ceil(avg);             // 4(切り上げ)
        System.out.printf("avg=%.2f ceil=%d%n", avg, ceil);
    }
}
Java

「整数→小数」へ明示的に変換し、表示は printf、丸めは Math を使うのが定石です。

例 2: ページネーション(除算と剰余の組み合わせ)

public class Pagination {
    public static void main(String[] args) {
        int items = 101;
        int perPage = 20;
        int pages = (items + perPage - 1) / perPage; // 切り上げページ数
        System.out.println("pages=" + pages);        // 6
    }
}
Java

「切り上げ除算」は現場で頻出します。式をパターンとして覚えると即戦力です。

例 3: 安全なモジュロでインデックス循環

public class RingIndex {
    public static void main(String[] args) {
        int size = 5;
        int i = -1;
        int idx = ((i % size) + size) % size; // 0..size-1 に正規化
        System.out.println(idx);              // 4
    }
}
Java

負の剰余を正の範囲に写像するテクニックは、キーボード入力やカーソル移動の循環で便利です。


お金の計算は BigDecimal(算術の実務知識)

浮動小数点の誤差を避ける

import java.math.BigDecimal;

public class Money {
    public static void main(String[] args) {
        BigDecimal price = new BigDecimal("1999.50");
        BigDecimal tax   = new BigDecimal("0.10");
        BigDecimal total = price.multiply(tax).add(price); // 2199.45
        System.out.println(total);
    }
}
Java

double は丸め誤差を避けられないため、金額やポイント計算は BigDecimal 一択です。文字列から生成するのが基本で、桁と丸めはルールに合わせて指定します。


仕上げのアドバイス(重要ポイントのまとめ)

整数どうしの割り算は切り捨て、小数へは明示変換。ゼロ割りは int で例外、double で Infinity/NaN。負の剰余は符号に引っ張られるため、必要なら正規化。オーバーフローは沈黙して壊れるので、範囲を見積もり long やチェックで守る。評価順序は括弧で明示し、複雑な式に ++/-- を混ぜない。お金は BigDecimal。この基本を体に落とせば、算術でのバグは大幅に減ります。

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