本ページはプロモーションが含まれています

Java入門

【Java】Math.sqrt()で平方根を計算する方法|NaN対策と整数変換まで解説

トム

・都内自社開発企業勤務/Javaバックエンドエンジニア
/Java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎 詳細なプロフィール

「Javaで平方根を計算したいが、Math.sqrt()の使い方がわからない」「負の数を渡したらNaNになって止まった」——こうした疑問に、この記事でまとめて答えます。

結論、Javaで平方根を求めるならMath.sqrt(数値)を呼ぶだけで完了します。ただし戻り値がdouble型であることと、負の数でNaNが返ることを知らないと、コンパイルエラーや想定外の挙動でハマります。

この記事では、Math.sqrt()の基本構文から、NaN回避・整数への変換・BigDecimalでの高精度計算、ピタゴラスの定理やゲーム当たり判定での実例までを、コピペで動くサンプルコード付きで解説します。

Java経験者の筆者が、2Dゲーム開発でMath.sqrtを使った経験も交えて書いたので、「公式ドキュメントを読んでもピンとこない」初心者でも迷わず使えるようになります(本記事の動作確認は2026年4月時点のJava 21 LTS環境で実施)。

この記事でわかること

  • Math.sqrt()の基本的な使い方とMath.pow()との違い
  • 正の数・負の数・ゼロを渡したときの挙動と対処法
  • ピタゴラスの定理やゲーム開発など実務での活用例
  • 小数点以下の切り捨て・四捨五入やBigDecimalでの高精度計算

Javaで平方根を求める基本

Javaで平方根を計算するのは、実は非常にシンプルです。標準で用意されているMathクラスのsqrt()メソッドを使うだけで、誰でも簡単に求めることができます。

Math.sqrt()の使い方

Math.sqrt()は、引数に指定した数値の平方根を返してくれるメソッドです。使い方はとても直感的で、以下のように記述します。

Math.sqrt(平方根を求めたい数値);

例えば、9の平方根を求めたい場合は、Math.sqrt(9)と書くだけです。Math.sqrt(9)だけで、計算結果の3.0が返ってきます。とても簡単ですね。

// 9の平方根を求める
double result = Math.sqrt(9);

// 結果を出力する
System.out.println("9の平方根は " + result + " です。");
// 出力結果:9の平方根は 3.0 です。

// 2の平方根を求める
double result2 = Math.sqrt(2);
System.out.println("2の平方根は " + result2 + " です。");
// 出力結果:2の平方根は 1.4142135623730951 です。

Math.sqrt()なら1行書くだけで平方根が求められるので、複雑な計算式を自分で実装する必要はありません。

Math.pow()との違い

JavaのMathクラスには、べき乗を計算するpow()というメソッドもあります。Math.pow(数値, 0.5)のように記述すれば、0.5乗、つまり平方根を求めることも可能です。

// Math.pow()を使って9の平方根を求める
double result = Math.pow(9, 0.5);

System.out.println("9の平方根は " + result + " です。");
// 出力結果:9の平方根は 3.0 です。

結果は同じになりますが、Javaで平方根を求める場合はMath.sqrt()を使うのが一般的です。sqrtは "square root" (平方根) の略であり、コードを見たときに「平方根を求めている」と一目でわかります。

可読性(コードの読みやすさ)は、他の人がコードを修正したり、未来の自分が見返したりする際に非常に重要です。特別な理由がない限り、平方根の計算にはMath.sqrt()を使いましょう。

計算結果の型と注意点(double型になる理由)

Math.sqrt()を使う上で、1つだけ知っておきたい大切な注意点があります。計算結果が必ずdouble型になる点です。

double型は、小数点以下を扱うことができるデータ型です。なぜint型(整数)ではなくdouble型なのでしょうか。

理由は単純で、平方根の計算結果は必ずしも整数になるとは限らないからです。例えば、Math.sqrt(9)の結果は3ですが、Math.sqrt(2)の結果は1.414...という無理数になります。

もし、Math.sqrt()の戻り値がint型だと、小数点以下の値が失われてしまい、正確な計算ができません。そのため、どのような数値の平方根でも正しく扱えるように、double型で結果を返す仕組みになっています。

なお、int result = Math.sqrt(16);のようにint型で受け取ろうとするとコンパイルエラーになります。

// このコードはコンパイルエラーになります
int result = Math.sqrt(16); // double型をint型に入れようとしているためエラー

計算結果を整数として扱いたい場合は、後述する型変換(キャスト)を明示的に行う必要があります。

Javaで平方根を計算するサンプルコード

実際にMath.sqrt()を使ったサンプルコードをいくつか見ていきましょう。具体的なコードを見ることで、Javaでの平方根の使い方がより深く理解できます。

正の数の平方根を求める例

まずは、最も基本的な正の数の平方根を求めるサンプルです。変数に格納された値の平方根を計算してみます。

public class Main {
    public static void main(String[] args) {
        // 平方根を求めたい数値を準備
        double number1 = 25.0;
        double number2 = 12.0;

        // Math.sqrt()で平方根を計算
        double root1 = Math.sqrt(number1);
        double root2 = Math.sqrt(number2);

        // 結果を出力
        System.out.println(number1 + " の平方根は " + root1 + " です。");
        System.out.println(number2 + " の平方根は " + root2 + " です。");
    }
}

実行結果

25.0 の平方根は 5.0 です。
12.0 の平方根は 3.4641016151377544 です。

整数でも小数でも、Math.sqrt()を使えば簡単に平方根が計算できます。

負の数を扱う場合のエラーと対処法

数学の世界では、負の数の平方根は「虚数」として扱われますが、Math.sqrt()に負の数を渡すとどうなるのでしょうか。

実際に試してみましょう。

// 負の数の平方根を計算しようとする
double number = -16.0;
double result = Math.sqrt(number);

System.out.println(number + " の平方根は " + result + " です。");

実行結果

-16.0 の平方根は NaN です。

エラーにはなりませんが、結果がNaNとなりました。NaNは "Not a Number" の略で、「非数」を意味します。NaNは、計算結果が実数として表現できないことを示す特別な値です。

プログラムでNaNが発生すると、意図しない挙動の原因になる可能性があります。そのため、Math.sqrt()を使う前に入力値が負でないかチェックするのが安全な方法です。

public class Main {
    public static void main(String[] args) {
        double number = -25.0;

        // 計算前に数値が0以上かチェックする
        if (number >= 0) {
            double root = Math.sqrt(number);
            System.out.println(number + " の平方根は " + root + " です。");
        } else {
            System.out.println("負の数の平方根は計算できません。");
        }
    }
}

if文で条件分岐させることで、負の数が渡された場合にエラーメッセージを表示するなど、適切な処理を行えます。

NaN混入のハマりどころ(筆者経験)

業務で統計集計バッチを書いたとき、平均値からMath.sqrt(分散)で標準偏差を出す処理がありました。分散が浮動小数誤差で-0.0000001のような微小な負値になり、NaNが後続の集計結果全体を汚染する事故が起きました。教訓は「期待しない負値」も想定してMath.max(0, 分散)でクランプすること。NaNは一度混入すると比較演算・合計・平均すべてをNaNに変える性質があり、早期検出が極めて重要です。

Math.sqrt()が0・無限大・NaNを渡されたときの挙動

負の数以外にも、特殊値を渡したときの挙動は覚えておきましょう。Java公式仕様(JLS)で次のように定められています。

入力値戻り値
0.0 / -0.0入力と同じ値(+0.0 / -0.0
正の無限大 Double.POSITIVE_INFINITY正の無限大
負の値(負の無限大含む)NaN
NaNNaN

NaN同士の比較は常にfalseになる点が落とし穴です。結果を判定するときはDouble.isNaN(result)を使ってください。

ユーザー入力から平方根を計算するプログラム

Scannerクラスを使い、ユーザーが入力した数値の平方根を計算するプログラムも作ってみましょう。より実践的な使い方がイメージできます。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // Scannerのインスタンスを作成
        Scanner scanner = new Scanner(System.in);

        System.out.print("平方根を求めたい数値を入力してください: ");
        
        // ユーザーがdouble型の数値を入力するのを待つ
        double inputNumber = scanner.nextDouble();

        // 入力値が負でないかチェック
        if (inputNumber >= 0) {
            // 平方根を計算
            double result = Math.sqrt(inputNumber);
            System.out.println(inputNumber + " の平方根は " + result + " です。");
        } else {
            System.out.println("エラー: 負の数は入力できません。");
        }

        // Scannerを閉じる
        scanner.close();
    }
}

このプログラムを実行すると、コンソールにメッセージが表示され、数値の入力を求められます。正の数を入力すればその平方根が、負の数を入力すればエラーメッセージが表示される、対話的なアプリケーションが完成しました。

Javaで平方根を活用できる場面

Javaの平方根計算は、具体的にどのような場面で役立つのでしょうか。ここでは、3つの代表的な活用例を紹介します。

三角形や距離計算(ピタゴラスの定理)

平方根の最も有名な使い道の一つが、ピタゴラスの定理(三平方の定理)です。直角三角形の2辺の長さがわかっていれば、残りの1辺(斜辺)の長さを計算できます。

公式は a² + b² = c² ですが、これを c について解くと c = √(a² + b²) となり、平方根の計算が必要になります。

ピタゴラスの定理は、2つの点の間の直線距離を求める際にも応用できます。例えば、2D座標上の点A(x1, y1)と点B(x2, y2)の距離を求めるコードは以下のようになります。

// 2つの点の座標
double x1 = 1.0, y1 = 1.0;
double x2 = 4.0, y2 = 5.0;

// 各軸の距離を計算
double dx = x2 - x1; // x方向の距離
double dy = y2 - y1; // y方向の距離

// ピタゴラスの定理で2点間の距離を計算
// 2乗は Math.pow(dx, 2) でも可だが、dx * dx の方が高速
double distance = Math.sqrt((dx * dx) + (dy * dy));

System.out.println("2点間の距離は " + distance + " です。");
// 出力結果:2点間の距離は 5.0 です。

このように、地図アプリの距離計算やゲームキャラクター間の距離測定など、幅広い分野で活用されています。

補足: 2乗はMath.pow(dx, 2)でも計算できますが、dx * dxの方が約3〜10倍高速です。距離計算は毎フレーム呼ばれることが多いため、2乗には乗算を使うのが定石です。

なお、Javaには2点間距離専用のMath.hypot(dx, dy)メソッドもあります。内部でオーバーフローを防ぐ処理が入っているため、値が非常に大きいときも安全に√(dx² + dy²)を計算できます。

double distance = Math.hypot(dx, dy);
// Math.sqrt(dx*dx + dy*dy) とほぼ同じだがオーバーフローに強い

グラフィックスやゲームでの応用

グラフィックスやゲームプログラミングの世界でも、Javaの平方根は頻繁に登場します。

例えば、円形の当たり判定です。中心点からの距離が円の半径以下であれば「当たっている」と判定できますが、その距離を求めるのに先ほどのピタゴラスの定理、つまりMath.sqrt()が使われます。

また、ベクトルの正規化(長さを1にすること)でも平方根が必須です。正規化はキャラクターの移動方向を決めたり、光の反射を計算したりする際に欠かせません。Math.sqrtは、ゲーム世界を物理的に正しく表現するための土台となる処理なのです。

筆者の実例: 2D弾幕ゲームを自作した際、自機と敵弾の円形当たり判定を毎フレーム300個ほど走らせていました。当初はMath.sqrt(Math.pow(dx,2)+Math.pow(dy,2)) < rで書いていましたが、60FPS処理が重く、プロファイルするとMath.powがボトルネックでした。dx*dx + dy*dy < r*r両辺を2乗してMath.sqrt自体を省略する形に書き換えたところ、CPU負荷が約1/4に減った実測値があります。当たり判定のように「距離そのもの」が不要で閾値比較だけで済む場面では、Math.sqrtを呼ばないのが鉄則です。

数値解析やアルゴリズムでの平方根利用

より専門的な分野では、数値解析や統計学でも平方根が活用されます。代表的な例が「標準偏差」の計算です。標準偏差は、データのばらつき度合いを示す指標で、分散の正の平方根で求められます。

金融工学でリスクを分析したり、機械学習でモデルの性能を評価したりする際に、標準偏差は非常に重要な統計量です。金融工学や機械学習の複雑な計算の裏側でも、Math.sqrt()のような基本的な数学関数が活躍しています。

Math.sqrt()と他の平方根計算手段の比較

Javaで平方根を求める手段はMath.sqrt()以外にもあります。用途別の早見表で整理しました。

手段精度速度負の数主な用途
Math.sqrt()double (15〜17桁)◎ 最速NaN一般用途すべて
Math.pow(x, 0.5)doubleNaN冪乗計算を統一したいとき
StrictMath.sqrt()double(プラットフォーム非依存)NaNJVM間で結果を完全一致させたいとき
BigDecimal.sqrt() (Java 9+)任意桁× 低速ArithmeticException金融・科学計算の高精度要件
ニュートン法の手実装任意用途次第要ハンドリング学習・近似計算

迷ったらMath.sqrt()で十分です。精度不足を感じたときだけBigDecimal.sqrt()への切り替えを検討してください。

他言語のmath.sqrtとの違い

検索クエリmath.sqrtはPythonやJavaScriptでも共通で、言語を指定せず調べる人が多い語です。言語ごとの挙動差をまとめました。

言語呼び出し戻り値型負の数の挙動
JavaMath.sqrt(x)doubleNaN
Pythonmath.sqrt(x)floatValueError
JavaScriptMath.sqrt(x)numberNaN
C/C++sqrt(x)double実装依存(NaN or domain error)

JavaとJavaScriptはNaNで静かに返るため、入力チェックを自分で書く必要があります。

Javaの平方根計算でよくある質問

最後に、Javaで平方根を扱う際によくある質問とその回答をまとめました。

小数点以下を切り捨て・四捨五入したい場合

Math.sqrt()の計算結果はdouble型ですが、整数部分だけが欲しい場合や、特定の桁で四捨五入したいケースがあります。その場合は、Mathクラスの他のメソッドと組み合わせることで対応可能です。

切り捨て (整数にしたい場合):

Math.floor()を使うか、int型へキャストします。

double number = 10.0;
double root = Math.sqrt(number); // 約3.162...

// 方法1: Math.floor()で小数点以下を切り捨てる
double floored = Math.floor(root);
System.out.println("切り捨て (double): " + floored); // 3.0

// 方法2: int型にキャストして整数部分だけ取得
int intValue = (int) root;
System.out.println("切り捨て (int): " + intValue); // 3

四捨五入:

Math.round()を使います。このメソッドは、小数点第一位を四捨五入してlong型の整数を返します。

double number = 10.0;
double root = Math.sqrt(number); // 約3.162...

long rounded = Math.round(root);
System.out.println("四捨五入: " + rounded); // 3

もし小数点第二位で四捨五入したい場合は、一度10倍してから四捨五入し、再度10で割る、といった工夫で実現できます。

高速に平方根を求める方法はある?

ほとんどの場合、Math.sqrt()は十分に高速で、パフォーマンスのボトルネックになることはありません。Math.sqrt()はCPUのネイティブ命令(x86のSQRTSDなど)を利用して最適化されていることが多いからです。

そのため、自分で複雑なアルゴリズムを実装するよりも、標準のMath.sqrt()を使うのが最も安全で効率的です。

ただし、3Dグラフィックスや物理シミュレーションなど、1秒間に何百万回も平方根を計算するような極端な状況では、「カーマックの逆平方根」(ビット演算で高速に近似値を求めるテクニック)のような近似計算アルゴリズムが使われることもあります。

実測比較(筆者環境: Java 21 / M2 Pro / JMH):

手段ns/op相対速度
Math.sqrt(x)約3.2ns1.00x (基準)
Math.pow(x, 0.5)約18ns約5.6倍遅い
StrictMath.sqrt(x)約8ns約2.5倍遅い
BigDecimal.sqrt(mc) (精度20)約1,200ns約375倍遅い

※測定値は環境依存です。ご自身の環境でも傾向が同じか確認してから採用してください。

BigDecimalで平方根を計算できる?

double型は非常に高速ですが、誤差を含む可能性があります。金融計算のように、極めて高い精度が求められる場面ではBigDecimalクラスが使われます。

BigDecimalで平方根を計算したい場合、Java 9以降であればsqrt()メソッドが使えます(現在のLTSであるJava 21 / Java 25でも同じAPIです)。

import java.math.BigDecimal;
import java.math.MathContext;

public class Main {
    public static void main(String[] args) {
        BigDecimal number = new BigDecimal("2");
        MathContext mc = new MathContext(100); // 100桁の精度で計算

        BigDecimal root = number.sqrt(mc);
        
        System.out.println(root);
    }
}

このsqrt(MathContext mc)メソッドは、計算精度をMathContextで指定できるため、必要な桁数まで正確な平方根を求めることが可能です。古いバージョンのJava(Java 8以前)を使っている場合は、BigDecimal.sqrt()がないため、自分でニュートン法(漸近的に正解へ近づける反復計算手法)を実装するか、Apache Commons Mathなどの外部ライブラリを利用してください。

まとめ

Javaで平方根を計算する方法について解説しました。最後に要点を整理します。

  • Math.sqrt()に数値を渡すだけで平方根を取得できる
  • 戻り値はdouble型。整数が必要ならキャストやMath.round()で変換する
  • 負の数を渡すとNaNが返るため、事前に入力値をチェックする
  • 距離計算・ゲーム開発・統計分析など幅広い場面で活用できる
  • 高精度が必要な場合はJava 9以降のBigDecimal.sqrt()を使う
あわせて読む
  • この記事を書いた人
  • 最新記事

トム

・都内自社開発企業勤務/Javaバックエンドエンジニア
/Java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎 詳細なプロフィール

-Java入門