Math.floorDiv()とは何か
Javaで業務システムを開発していると、割り算の商(しょう)を求める処理は頻繁に登場します。
例えば、
- ページ数計算
- 在庫の箱数計算
- グループ分け処理
- 日数集計
- バッチ処理単位の計算
- インデックス計算
などです。
通常であれば、
a / bJavaを利用します。
しかしJavaには、
Math.floorDiv()Javaという特別な割り算メソッドがあります。
このメソッドは、
「商を数学的な切り下げ(floor)で計算する」
ためのメソッドです。
特に負の数が関係する計算では通常の割り算と結果が変わるため、実務では重要な知識になります。
まずは通常の整数除算を理解しよう
Javaの整数同士の割り算は、小数部分を切り捨てます。
// 整数除算
int result = 7 / 3;
System.out.println(result);
Java実行結果
2
7 ÷ 3 = 2.333…ですが、小数部分が切り捨てられます。
これだけならMath.floorDiv()との違いはありません。
問題は負の数です。
Math.floorDiv()の基本構文
構文は非常にシンプルです。
Math.floorDiv(被除数, 除数)Java実際に使ってみましょう。
// 割り算
int result =
Math.floorDiv(
7,
3
);
// 結果表示
System.out.println(result);
Java実行結果
2
正の数同士なら通常の割り算と同じ結果になります。
ステップバイステップで理解する
ステップ1:割る値を用意する
// 件数
int total = 25;
Javaステップ2:除数を用意する
// 1グループの人数
int groupSize = 5;
Javaステップ3:Math.floorDiv()を実行する
// グループ数計算
int result =
Math.floorDiv(
total,
groupSize
);
Javaステップ4:結果を確認する
// 出力
System.out.println(result);
Java実行結果
5
25 ÷ 5 = 5 が計算されました。
通常の割り算との違いはどこにあるのか
ここが最重要ポイントです。
正の数では違いが分かりません。
// 通常除算
System.out.println(-7 / 3);
Java実行結果
-2
一方、
// floorDiv
System.out.println(
Math.floorDiv(-7, 3)
);
Java実行結果
-3
結果が違います。
なぜ結果が違うのか
数学的な考え方を理解すると分かりやすくなります。
-7 ÷ 3 は、
-2.333333...
です。
通常の整数除算は、
-2.333...
↓
-2
になります。
これは0方向への切り捨てです。
しかしMath.floorDiv()は、
-2.333...
↓
-3
となります。
数学的な「床関数(floor)」を使用するためです。
つまり、
「小さい方向へ切り下げる」
と考えると分かりやすいでしょう。
floor(床関数)とは何か
Math.floorDiv()の名前の由来です。
floorは数学で
「値以下の最大の整数」
を意味します。
| 値 | floor値 |
|---|---|
| 2.9 | 2 |
| 2.1 | 2 |
| -2.1 | -3 |
| -2.9 | -3 |
Math.floorDiv()はこの考え方で商を求めています。
通常除算との比較表
| 計算式 | / | floorDiv |
|---|---|---|
| 7 / 3 | 2 | 2 |
| -7 / 3 | -2 | -3 |
| 7 / -3 | -2 | -3 |
| -7 / -3 | 2 | 2 |
負数が絡む場合に差が発生します。
実務でよくある利用例① インデックス計算
// データ位置
int position = -7;
// 区間サイズ
int blockSize = 3;
// ブロック番号
int block =
Math.floorDiv(
position,
blockSize
);
System.out.println(block);
Java負方向を含む座標計算で利用されます。
実務でよくある利用例② 日数区分計算
// 経過時間
long minutes = 1500;
// 日数換算
long days =
Math.floorDiv(
minutes,
1440
);
System.out.println(days);
Java集計システムで利用できます。
実務でよくある利用例③ グループ分け
// レコード番号
int id = 23;
// グループサイズ
int size = 5;
// グループ番号
int groupNo =
Math.floorDiv(
id,
size
);
Javaデータ分割処理などで利用されます。
実務でよくある利用例④ 座標システム
// X座標
int x = -15;
// セルサイズ
int cellSize = 10;
// セル番号
int cell =
Math.floorDiv(
x,
cellSize
);
JavaゲームやGISシステムで役立ちます。
Math.floorMod()との関係
Math.floorDiv()には相性の良い兄弟メソッドがあります。
Math.floorMod()Javaです。
通常、
商 → floorDiv
余り → floorMod
として利用します。
// 商
int quotient =
Math.floorDiv(
-7,
3
);
// 余り
int remainder =
Math.floorMod(
-7,
3
);
Java実務ではセットで登場することが多いです。
long型にも対応している
Math.floorDiv()はlong型にも対応しています。
// long版
long result =
Math.floorDiv(
100L,
3L
);
System.out.println(result);
Java実行結果
33
大規模データ処理でも利用できます。
特に重要:負の値を扱う業務ロジックで活躍する
初心者のうちは、
a / bJavaだけで十分に感じるかもしれません。
しかし、
- 座標システム
- 時系列分析
- 統計処理
- シミュレーション
- アルゴリズム開発
では、数学的な床関数を使った除算が必要になることがあります。
そのような場面でMath.floorDiv()が役立ちます。
実務で使えるテンプレート集
基本テンプレート
// 商の切り下げ
int result =
Math.floorDiv(
value,
divisor
);
Javalong型テンプレート
// long版
long result =
Math.floorDiv(
value,
divisor
);
Javaグループ計算テンプレート
// グループ番号
int groupNo =
Math.floorDiv(
recordNo,
groupSize
);
JavafloorMod併用テンプレート
// 商
int quotient =
Math.floorDiv(a, b);
// 余り
int remainder =
Math.floorMod(a, b);
Java情報セキュリティの観点から見る重要性
Math.floorDiv()自体はセキュリティ機能ではありません。
しかし統計処理や異常検知システムでは数学的に正しい計算が重要です。
例えば、
- ログ分析
- アクセス分析
- 行動分析
- 異常検知
- 機械学習前処理
などでは、負数を含むデータを正しく処理する必要があります。
Math.floorDiv()を利用することで、数学的に一貫した計算ができるようになります。
初心者が覚えておくべき重要ポイント
- 商を数学的に切り下げるメソッドである
- 正の数では通常除算とほぼ同じである
- 負の数で結果が変わる
- floorは「下方向への切り下げ」である
- Math.floorMod()とセットで利用される
- int型とlong型に対応している
- 負数を扱うロジックで特に有効である
まとめ
Math.floorDiv()は、数学的な床関数を利用して商を計算するJava標準メソッドです。
- 商を切り下げで計算できる
- 負の数で通常除算との違いが現れる
- floorの概念を正しく実装できる
- Math.floorMod()との相性が良い
- 座標計算や統計処理で活躍する
- 数学的に一貫した計算が可能になる
- Java開発者が知っておきたい数値演算ユーティリティである
特に業務システムやアルゴリズム実装では、負の数を含む除算処理が重要になる場面があります。そのようなケースでMath.floorDiv()を利用すると、数学的に正しい結果を得られるようになります。また、Math.floorMod()とあわせて理解することで、より高度な数値処理やデータ処理を実装できるようになるでしょう。
