Java入門|Mathクラスで数値計算を行う方法

計算のための便利な部品を使えるようになると、Javaの数値処理はもっとスマートになる

Javaでプログラムを書いていると、ただ四則演算をするだけでは足りない場面が少しずつ増えてきます。たとえば、2つの数のうち大きいほうを調べたいとき、絶対値を求めたいとき、乱数を使ってランダムな結果を作りたいときなどです。こうした処理を自分ですべて一から書くのは大変ですが、Javaにはあらかじめ便利な機能が用意されています。その代表が Mathクラス です。

Mathクラスには、数学的な計算を助けてくれるメソッドがたくさん入っています。最大値や最小値を調べる、累乗を求める、平方根を計算する、乱数を作るなど、実用的な処理をすぐに呼び出せます。しかも、これらの多くはクラスメソッドとして用意されているので、オブジェクトを作らなくても使えます。

ここでは、Mathクラスの基本的な考え方から、よく使うメソッドの意味、実際のプログラムでの使い方まで、やさしく整理しながら見ていきます。Mathクラスを使えるようになると、数値を扱うプログラムがぐっと書きやすくなります。

Mathクラスとは何か

Mathクラスは、数値計算に役立つ機能をまとめたクラスです。Javaでは、普通の足し算や引き算は演算子で書けますが、それだけでは対応しにくい計算もあります。

たとえば、次のような処理です。

やりたいこと
大きいほうを調べる8 と 15 のうち大きい値を知りたい
小さいほうを調べる3 と 9 のうち小さい値を知りたい
絶対値を求める-7 を 7 として扱いたい
平方根を求める25 の平方根を知りたい
累乗を求める2 の 3乗を求めたい
乱数を作るサイコロの目をランダムに出したい

こうした処理を簡単に行えるようにしたのが Mathクラス です。

Mathクラスはクラスメソッドで使う

Mathクラスの大きな特徴は、便利なメソッドの多くが クラスメソッド であることです。つまり、new を使って Mathクラスのオブジェクトを作らなくても使えます。

呼び出し方は次のようになります。

Math.メソッド名(引数)

たとえば、最大値を調べるならこうです。

Math.max(8, 15)

この書き方は、以前学んだ Integer.parseInt() と似ています。どちらもクラス名をつけて直接呼び出しています。

Mathクラスの主なメソッド

Mathクラスにはいろいろなメソッドがあります。主なものを整理すると、次のようになります。

メソッド名機能
abs絶対値を返す
ceil指定した値以上の最も小さい整数値を返す
cosコサイン値を返す
floor指定した値以下の最も大きい整数値を返す
max2つの値のうち大きいほうを返す
min2つの値のうち小さいほうを返す
pow累乗した結果を返す
random0.0以上1.0未満の乱数を返す
rint最も近い整数値を返す
sinサイン値を返す
sqrt平方根を返す
tanタンジェント値を返す

この中でも、学習の初期段階で特によく使うのは max、min、abs、pow、sqrt、random あたりです。

まずは max() メソッドから見てみよう

Mathクラスの中でもとても分かりやすいのが max() メソッドです。これは、2つの値のうち大きいほうを返すメソッドです。

たとえば、

Math.max(5, 10)

なら、結果は 10 になります。

数値を比較して大きいほうを知りたい場面はとても多いので、max() はかなり実用的です。

シンプルな例で確認しよう

ファイル名:Sample5.java

import java.io.*;

class Sample5
{
    public static void main(String[] args) throws IOException
    {
        // キーボード入力の準備をする
        BufferedReader br =
            new BufferedReader(new InputStreamReader(System.in));

        // 2つの整数を入力してもらう
        System.out.println("2つの点数を入力してください。");
        String str1 = br.readLine();
        String str2 = br.readLine();

        // 文字列を整数に変換する
        int num1 = Integer.parseInt(str1);
        int num2 = Integer.parseInt(str2);

        // 大きいほうの値を調べる
        int ans = Math.max(num1, num2);

        // 結果を表示する
        System.out.println("高い点数は " + ans + " 点です。");
    }
}

たとえば、次のように入力したとします。

2つの点数を入力してください。
72
88

表示結果は次のようになります。

高い点数は 88 点です。

このプログラムでは、入力した2つの整数を比較し、大きいほうだけを取り出しています。if文で比較を書くこともできますが、Math.max() を使うと短く分かりやすく書けます。

プログラムの流れを整理しよう

このプログラムの流れを表で整理すると、Math.max() の役割がより見えやすくなります。

順番処理内容説明
1文字列として入力を受け取るキーボード入力は最初は文字列
2Integer.parseInt() で変換する計算できる整数にする
3Math.max() を呼び出す大きいほうの値を調べる
4結果を表示する最大値を画面に出す

ここからも分かるように、Mathクラスはほかのクラスと組み合わせて使うと、とても便利です。

max() はオーバーロードされている

Math.max() は1種類だけではありません。int型どうしを比べるものもあれば、double型どうしを比べるものもあります。これが オーバーロード です。

たとえば、次のように書けます。

Math.max(5, 10);
Math.max(12.5, 20.5);

この場合、引数の型に合わせて適切な max() が呼び出されます。

これを表にすると、次のように見られます。

呼び出し例使われる考え方
Math.max(5, 10)int型どうしの比較
Math.max(12.5, 20.5)double型どうしの比較

つまり、同じメソッド名でも、受け取る引数の型に応じて使い分けられているわけです。

min() メソッドもセットで覚えると便利

max() とあわせて覚えたいのが min() です。こちらは、2つの値のうち小さいほうを返します。

Math.min(5, 10)

この結果は 5 になります。

max() と min() の違いを整理すると、次のようになります。

メソッド役割
max大きいほうを返す
min小さいほうを返す

比較処理では、この2つをセットで覚えておくとかなり便利です。

abs() で絶対値を求める

abs() は、絶対値を求めるメソッドです。負の数を正の数として扱いたいときに使います。

Math.abs(-7)

この結果は 7 です。

絶対値は、差の大きさを調べたいときなどによく使います。

呼び出し例結果
Math.abs(-12)12
Math.abs(5)5

プラスの数はそのまま、マイナスの数は符号を外した値になります。

sqrt() で平方根を求める

sqrt() は平方根を返すメソッドです。

Math.sqrt(25)

この結果は 5.0 になります。

平方根は、図形や距離の計算などで使われます。戻り値は double型になるので、その点も意識しておくとよいです。

呼び出し例結果
Math.sqrt(9)3.0
Math.sqrt(16)4.0
Math.sqrt(2)1.414...

pow() で累乗を求める

pow() は、ある数を何乗するかを求めるメソッドです。

Math.pow(2, 3)

この結果は 8.0 です。これは 2 の 3乗 を表しています。

呼び出し例意味結果
Math.pow(2, 3)2の3乗8.0
Math.pow(10, 2)10の2乗100.0

こちらも戻り値は double型です。

random() で乱数を使う

Mathクラスの中でも、とても実用的で楽しいのが random() メソッドです。これは、0.0以上1.0未満の乱数を返します。

Math.random()

ただし、このままだと小数なので、欲しい範囲の整数に変える工夫が必要です。

たとえば、1〜6の整数、つまりサイコロの目を作りたいなら、次のようにします。

int num = (int)(Math.random() * 6) + 1;

この式の意味を分解するとこうなります。

意味
Math.random()0.0以上1.0未満の小数を作る
Math.random() * 60.0以上6.0未満に広げる
(int)(...)小数部分を切り捨てる
+ 11〜6の範囲にする

これで、1から6までの整数をランダムに得られます。

random() のイメージをつかもう

乱数の変換は少し分かりにくいので、表で見てみると理解しやすいです。

Math.random() の値× 6 の結果intに変換後+1 の後
0.100.6001
0.452.7023
0.925.5256

この流れを見ると、1〜6の整数ができる理由が見えやすくなります。

ceil() と floor() の違い

Mathクラスには、切り上げや切り下げに使えるメソッドもあります。

メソッド機能
ceil指定した値以上の最も小さい整数値を返す
floor指定した値以下の最も大きい整数値を返す

たとえば、

Math.ceil(3.2)

は 4.0 になり、

Math.floor(3.8)

は 3.0 になります。

小数の扱いを整理したいときに便利です。

この図では、中央の Mathクラス から、いくつかの代表的なメソッドが広がる形で表現しています。max() は大きい値、min() は小さい値、abs() は絶対値、sqrt() は平方根、random() は乱数というように、それぞれの役割がひと目で分かる構成です。

特に初心者のうちは、Mathクラスをひとつの便利な計算箱のようにとらえると理解しやすいです。必要な計算に応じて、その中からぴったりのメソッドを呼び出すイメージを持つと、コードが読みやすくなります。

Mathクラスが役立つ場面

Mathクラスは、実際のプログラムでもいろいろな場面で使えます。

場面使うメソッドの例
点数の比較max、min
温度差や距離差の大きさabs
面積や長さの計算sqrt、pow
ゲームや抽選random
小数の切り上げ・切り下げceil、floor

つまり、Mathクラスは単なる数学用の知識ではなく、実用的なプログラムづくりのための便利な道具です。

よくある注意点

Mathクラスを使うときには、いくつか意識しておきたい点があります。

注意点内容
クラスメソッドとして使うnew は不要
戻り値の型に注意するsqrt や pow は double型
random() はそのままだと小数整数にしたいなら変換が必要
max() や min() は型に応じて使い分けられるオーバーロードされている

特に、戻り値が int か double かは大切です。見た目が整数っぽくても、実際には double型が返るメソッドも多いので、そこは丁寧に見ておくと安心です。

Mathクラスを使えるようになると、数値の比較、絶対値の取得、累乗、平方根、乱数など、少し高度な計算がぐっと簡単になります。Javaの中には、こうした便利な機能がすでに用意されているので、自分で全部作ろうとせず、必要な場面で上手に使っていくことが大切です。