「Javaで平方根を計算したいが、Math.sqrt()の使い方がわからない」「負の数を渡したらNaNになって止まった」。
こうした疑問に、この記事でまとめて答えます。
結論、Javaで平方根を求めるならMath.sqrt(数値)を呼ぶだけで完了します。
ただし戻り値がdouble型であることと、負の数でNaNが返ることを知らないと、コンパイルエラーや想定外の挙動でハマります。
この記事では、Math.sqrt()の基本構文から、NaN回避・整数への変換・BigDecimalでの高精度計算、ピタゴラスの定理やゲーム当たり判定での実例までを、コピペで動くサンプルコード付きで解説します。
主なコード例は実行結果つきで載せているので、「公式ドキュメントを読んでもピンとこない」初心者でも迷わず使えます。動作確認は2026年4月時点のJava 21 LTS環境で行いました。
この記事でわかること
Math.sqrt()の基本的な使い方とMath.pow()との違い- 正の数・負の数・ゼロを渡したときの挙動と対処法
- ピタゴラスの定理やゲーム開発など実務での活用例
- 小数点以下の切り捨て・四捨五入やBigDecimalでの高精度計算
PARTS LIST /目次
Javaで平方根(ルート)を求める基本
Javaで平方根を求めるには、標準のMathクラスにあるsqrt()を呼ぶだけです。
戻り値はdouble型で、負の数を渡すとNaNが返ります。整数の平方根でも3.0のように小数つきで返るため、整数として使うときは型変換が必要です。
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()で平方根を計算するサンプルコード
ここでは、正の数・負の数(NaN)・特殊値・ユーザー入力の4パターンを、実行結果つきのコードで確認します。負の数を渡してもエラーにはならず、NaNのまま処理が進む点に注意してください。最後のユーザー入力の例では、入力値が0以上かを先にチェックする書き方も紹介します。
正の数の平方根を求める例
まずは、最も基本的な正の数の平方根を求めるサンプルです。変数に格納された値の平方根を計算してみます。
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が一度でも計算に混ざると、その後の足し算や平均の結果もすべて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混入のハマりどころ
標準偏差を「2乗の平均 − 平均の2乗」で分散から求めると、浮動小数の誤差で分散がわずかに負になることがあります。{0.1, 0.1, 0.1}で計算すると分散は-1.7E-18になり、Math.sqrt()はNaNを返します。対策は「ありえない負値」も想定してMath.max(0, 分散)で0に切り上げることです。NaNは一度混入すると合計・平均をNaNに変え、NaN == NaNやNaN < 1.0のような比較もfalseになる(!=だけはtrueになる)性質があり、早期検出が重要です。
Math.sqrt()が0・無限大・NaNを渡されたときの挙動
負の数以外にも、特殊値を渡したときの挙動は覚えておきましょう。Math.sqrt()の公式APIドキュメント(Javadoc)で次のように定められています。
NaN == NaNはfalseになる(NaN != NaNはtrueになる)点が落とし穴です。結果を判定するときは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の平方根はどんな場面で使う?
平方根がよく使われるのは、2点間の距離(ピタゴラスの定理)、ゲームの当たり判定・ベクトルの正規化、標準偏差などの統計計算の3つです。どれも「2乗して足し、最後に平方根を取る」という同じ形の計算です。用途ごとに、Math.sqrt()を呼ぶ場所と、呼ばずに済ませる工夫を見ていきます。
三角形や距離計算(ピタゴラスの定理)
平方根の最も有名な使い道の一つが、ピタゴラスの定理(三平方の定理)です。
直角三角形の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と書くほうが短く読みやすくなります。速度は、手元の簡易計測(Apple M4 / JDK 21.0.5)ではJITの最適化が効くためほぼ同じでした。
距離計算は毎フレーム呼ばれることが多いため、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シューティングのように、毎フレーム大量の距離判定を行う場面では、平方根を計算する回数が処理の重さに直結します。
距離も半径も0以上なので、Math.sqrt(dx*dx + dy*dy) < rは、両辺を2乗したdx*dx + dy*dy < r*rと数学的には同じ結果です(浮動小数点の丸めがあるため、距離が半径にほぼ等しい境界ぎりぎりの値では結果が食い違うことがあります)。書き換えるとMath.sqrtの呼び出し自体を省略できます。
当たり判定のように「距離そのもの」が不要で閾値比較だけで済む場面では、Math.sqrtを呼ばないのが鉄則です。
数値解析やアルゴリズムでの平方根利用
より専門的な分野では、数値解析や統計学でも平方根が活用されます。代表的な例が「標準偏差」の計算です。
標準偏差は、データのばらつき度合いを示す指標で、分散の正の平方根で求められます。
金融工学でリスクを分析したり、機械学習でモデルの性能を評価したりする際に、標準偏差は重要な統計量です。
金融工学や機械学習の複雑な計算の裏側でも、Math.sqrt()のような基本的な数学関数が活躍しています。
Math.sqrt()と他の平方根計算手段はどう違う?
Javaで平方根を求める手段はMath.sqrt()以外にもあります。用途別の早見表で整理しました。
迷ったらMath.sqrt()で十分です。精度不足を感じたときだけBigDecimal.sqrt()への切り替えを検討してください。
他言語のmath.sqrtとの違い
検索クエリmath.sqrtはPythonやJavaScriptでも共通で、言語を指定せず調べる人が多い語です。言語ごとの挙動差をまとめました。
JavaとJavaScriptはNaNで静かに返るため、入力チェックを自分で書く必要があります。
sqrtを使わずに平方根を求める(ニュートン法)
授業の課題やアルゴリズムの練習では、「Math.sqrt()を使わずに平方根を求める」問題がよく出ます。
代表的な解き方がニュートン法です。今の近似値rとx / rの平均を取る計算を繰り返すと、本当の平方根にすばやく近づきます。
public class NewtonSqrt {
// ニュートン法で平方根を求める(Math.sqrtを使わない)
static double sqrt(double x) {
if (x < 0) {
throw new IllegalArgumentException("負の数は計算できません: " + x);
}
if (x == 0) {
return 0;
}
double r = x; // 初期値は x 自身
while (true) {
double next = (r + x / r) / 2; // r と x/r の平均で真の値に近づける
if (Math.abs(next - r) < 1e-12 * next) { // 変化がごく小さくなったら終了
return next;
}
r = next;
}
}
public static void main(String[] args) {
System.out.println(sqrt(2)); // ニュートン法
System.out.println(Math.sqrt(2)); // 比較用
System.out.println(sqrt(16));
}
}
sqrt(2)の結果は1.414213562373095で、Math.sqrt(2)の1.4142135623730951とは最後の桁だけが違います。x = 2では6回の繰り返しで止まりました。
next = (r + x / r) / 2r と x / r の平均を次の近似値にするr = 2.01.51.41666666666666651.41421568627450971.41421356237468991.4142135623730951.414213562373095Math.abs(next - r) < 1e-12 * next。0からxまでの範囲を半分ずつ絞り込む二分法でも求められますが、ニュートン法より繰り返しが多くなります。実務では速くて正確なMath.sqrt()を使い、自作は学習用にとどめてください。
立方根はMath.cbrt()で求める
3乗根(立方根)には専用のMath.cbrt()があります。平方根のMath.pow(x, 0.5)と同じ感覚でMath.pow(x, 1.0 / 3)と書くと、誤差や負の数でつまずきます。
public class CbrtSample {
public static void main(String[] args) {
System.out.println(Math.cbrt(64)); // 4.0
System.out.println(Math.cbrt(-8)); // -2.0(負の数もそのまま計算できる)
System.out.println(Math.pow(64, 1.0 / 3)); // 3.9999999999999996(誤差が出る)
System.out.println(Math.pow(-8, 1.0 / 3)); // NaN(powは負の数の1/3乗を計算できない)
System.out.println((int) Math.pow(64, 1.0 / 3)); // 3(キャストすると1ずれる)
}
}
Math.pow(64, 1.0 / 3)は3.9999999999999996になり、intにキャストすると3になってしまいます。Math.cbrt()なら64に4.0、負の数の-8にも-2.0を返します。
Javaの平方根計算でよくある質問
Javaで平方根を扱う際によくある質問とその回答をまとめました。切り捨て・高速化・高精度計算のほか、負の数を渡したときの結果、int型での受け取り、Math.pow()との違いも取り上げています。細かい根拠やコードは、それぞれの見出しの本文も確認してください。
Q1. Math.sqrt()の結果を切り捨て・四捨五入するには?
A1. 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で割る、といった工夫で実現できます。
Q2. 高速に平方根を求める方法はある?
A2. ほとんどの場合、Math.sqrt()は十分に高速で、パフォーマンスのボトルネックになることはありません。Math.sqrt()はCPUのネイティブ命令(x86のSQRTSDなど)を利用して最適化されていることが多いからです。
そのため、自分で複雑なアルゴリズムを実装するよりも、標準のMath.sqrt()を使うのが最も安全で効率的です。
ただし、3Dグラフィックスや物理シミュレーションなど、1秒間に何百万回も平方根を計算するような極端な状況では、「カーマックの逆平方根」(ビット演算で高速に近似値を求めるテクニック)のような近似計算アルゴリズムが使われることもあります。
速度の目安(Apple M4 / JDK 21.0.5 での簡易計測):※4,096個の乱数をループで繰り返し計算し、System.nanoTime()で測った目安です(JMHによる厳密な計測ではありません)。値は環境で変わるため、手段どうしの差の大きさを比べる用途で見てください。
Q3. BigDecimalで平方根を計算できる?
A3. 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などの外部ライブラリを利用してください。
Q4. Math.sqrt()に負の数を渡すとどうなる?
A4. エラーにはならず、NaN(非数)が返ります。NaN == NaNはfalseになる(NaN != NaNはtrueになる)ため、判定にはDouble.isNaN()を使い、計算の前に入力が0以上かをチェックしておくと安全です。
Q5. Math.sqrt()の結果をint型で受け取れる?
A5. そのままでは受け取れません。int result = Math.sqrt(16);は「精度が失われる可能性があるdoubleからintへの変換」というコンパイルエラーになります。(int) Math.sqrt(16)のようにキャストするか、Math.round()で丸めてから変換します。
Q6. Math.sqrt()とMath.pow(x, 0.5)の違いは?
A6. 通常の正の数では同じ結果になります(JDK 23で乱数100万件を比べて不一致0件)。ただし-0.0と負の無限大では異なり、Math.sqrt()は-0.0とNaN、Math.pow(x, 0.5)は0.0と正の無限大を返します。平方根だと一目でわかるMath.sqrt()を使うのが一般的です。
まとめ
Javaで平方根を計算する方法について解説しました。最後に要点を整理します。
Math.sqrt()に数値を渡すだけで平方根を取得できる- 戻り値は
double型。整数が必要ならキャストやMath.round()で変換する - 負の数を渡すと
NaNが返るため、事前に入力値をチェックする - 距離計算・ゲーム開発・統計分析など幅広い場面で活用できる
- 高精度が必要な場合はJava 9以降の
BigDecimal.sqrt()を使う Math.sqrt()を使わないならニュートン法、立方根はMath.cbrt()で求める
| REV. | DATE | 内容 |
|---|---|---|
| 5 | 2026-10-16 | 図解を描き直し(図面のデザインにそろえた) |
| 4 | 2026-10-14 | 雰囲気だけの挿絵を外した |
| 3 | 2026-10-04 | 記載内容の事実確認と修正 |
| 2 | 2026-09-04 | 2026年9月時点の情報で全体を見直し |
| 1 | 2025-09-25 | 初版 |


