読み込み中...

Javaで平方根を計算する5つの簡単な方法

Javaプログラムで平方根を計算するイラスト Java
この記事は約27分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Javaで平方根を求めるなら、通常はMath.sqrt()を使うのが最短です。計算対象がdoubleで扱える範囲なら、標準ライブラリだけで読みやすいコードを書けます。

ただし、入力値が負数の場合はNaNになり、整数の巨大な値ではBigIntegerや独自アルゴリズムの検討が必要になります。そのため、平方根の計算方法は、数値型、精度、処理対象の個数を分けて考えると整理しやすくなるのが基本です。

プログラミング初心者がつまずきやすいのは、平方根そのものよりも、intdoubleBigIntegerの違いと、結果の丸め方です。サンプルコードを見ながら、単体の数値、独自メソッド、大きな整数、近似計算、Stream APIによる一括処理まで順に確認します。

動作確認環境
  • Java SE 21 / JDK 21
  • 標準ライブラリ: java.lang.Mathjava.math.BigIntegerjava.util.stream
  • コンパイル例: javac、実行例: java
📖 この記事で学べること
  • Math.sqrt()で平方根を計算する基本
  • 独自メソッド化して再利用しやすくする考え方
  • BigIntegerで大きな整数を扱うときの注意点
  • ニュートン法による近似値の計算方法
  • Stream APIで複数値をまとめて処理する書き方

Javaとは

Javaは、クラスを中心にプログラムを組み立てるオブジェクト指向の言語です。classpublicstaticvoidなどの構文を使い、処理の入口としてmainメソッドを用意します。

一般に、Javaのプログラムは.javaファイルをjavacでコンパイルし、生成された.classファイルをjavaコマンドで実行します。その仕組みを支えるのがJVMであり、同じバイトコードを複数の環境で動かしやすい点が特徴です。

平方根のような数学処理では、標準ライブラリのjava.lang.Mathが中心になるのが目安です。公式ドキュメントによれば、Java SE 21のMathクラスには平方根や三角関数などの基本的な数値演算が用意されています。

プログラミング初心者にとっては、言語仕様を広く覚えるより、目的に合う標準APIを選ぶ練習が理解を進めます。平方根を求める処理なら、最初にMath.sqrt()を押さえ、必要に応じてBigIntegerStreamへ広げる流れが扱いやすいです。

Javaの歴史と特徴

Javaは1990年代に登場し、現在もサーバーサイド、Android関連、業務システム、学習用途などで使われているのがポイントです。長く使われているため、公式仕様、APIドキュメント、学習資料が多く、エラーの調査もしやすい言語です。

これらの背景から、数値計算の学習題材としてもJavaは選びやすいです。MathBigDecimalBigIntegerListStreamなどの標準APIを組み合わせると、単純な計算からデータ処理まで同じ文法の延長で学べます。

一方、型が明確な言語なので、intdoubleの違いを無視すると期待と異なる結果になります。平方根の計算では小数が発生するため、戻り値がdoubleになる点を早い段階で意識すると混乱を減らせますし、ここがポイントです。

Javaでの平方根計算を学ぶ意味

平方根は、面積から一辺の長さを求める処理、距離計算、標準偏差、グラフィックス、機械学習の前処理などに現れます。Javaの基礎学習でも、数値型、メソッド呼び出し、条件分岐、反復処理をまとめて扱える題材になります。

そのため、平方根の徹底解説では、単にMath.sqrt(9)の書き方だけでなく、負数、巨大な整数、複数データ、近似値の扱いまで見ておく必要があるのが一般的です。プログラミング初心者ほど、サンプルコードの結果だけでなく、入力値が変わったときの動きに注目すると理解が深まります。

具体的には、Math.sqrt()は負数に対して例外を投げずDouble.NaNを返します。この仕様はMath.sqrt(double)の公式リファレンスで確認できるのが現実的です。

💡 Tips: 平方根の計算方法を選ぶ前に、入力が実数なのか整数なのか、結果に小数が必要なのか、複数件をまとめて処理するのかを分けると設計しやすくなります。
項目主なAPIや構文用途注意点関連する学習
単体の平方根Math.sqrt()通常の実数計算戻り値はdoubleメソッド呼び出し
負数の入力Double.NaN入力チェック実数の平方根は得られないif
整数値int小さな整数結果は小数になる場合がある型変換
小数値double一般的な数値計算浮動小数点誤差がある丸め処理
巨大整数BigInteger桁数の大きい整数Java 9以降はsqrt()も利用可能任意精度整数
高精度小数BigDecimal金融系などの小数平方根は設計方針が必要MathContext
近似計算ニュートン法アルゴリズム学習停止条件が必要while
複数値処理Streamリストの一括変換中間操作と終端操作を分けるmap
配列処理double[]固定長データインデックス管理が必要for
リスト処理List<Double>可読性重視の集合null混入に注意コレクション
出力System.out.println()学習用の表示本番ログとは別に考える標準出力
再利用独自メソッド同じ処理の共通化入力条件を決めるメソッド設計
例外設計IllegalArgumentException不正入力の通知呼び出し側との合意が必要例外処理
丸めMath.round()表示用の整形計算値そのものとは分ける表示形式
絶対値Math.abs()誤差判定差分比較に使う近似判定
平方x * x検算オーバーフローに注意演算子
べき乗Math.pow()指数計算平方根だけならsqrtが明確数学関数
型変換(double)整数から実数へ暗黙変換の理解が必要キャスト
定数final許容誤差の固定値の意味を名前にする可読性
入力値Scannerユーザー入力入力検証が必要標準入力
ファイル化SquareRootExample.java学習コードの保存クラス名とファイル名を合わせるコンパイル
パッケージimport外部クラスの利用java.langは自動で使える名前空間
メソッド参照Math::sqrtStreamでの変換型推論を理解する関数型構文
収集Collectors.toList()結果リスト作成Javaバージョンで選択肢が変わる終端操作
精度epsilon近似の停止条件小さすぎる値は反復が増えるアルゴリズム
比較>誤差判定浮動小数点の等価比較に注意条件式
反復while収束までの計算無限ループを避ける制御構文
整数平方根floor(sqrt(n))切り捨て整数解実数の平方根とは異なる数学仕様
検算result * result結果の妥当性確認丸め誤差を考えるテスト
関連学習Listoverride周辺知識の補強用途別に読む内部リンク

平方根の計算方法とサンプルコード

平方根の計算方法は、最初にMath.sqrt()を使う形で覚えると迷いにくくなります。Javaの標準APIで完結し、サンプルコードも短いため、プログラミング初心者が構文と出力の流れを確認する教材に向いています。

ただし、すべてのケースをMath.sqrt()だけで済ませる考え方は危険です。大きな整数を正確に扱いたい場合、複数の値をまとめて処理したい場合、近似計算の仕組みを学びたい場合では、別の書き方が必要になると整理できます。

この徹底解説では、元記事のサンプルコードを保ちながら、現在のJavaで理解しやすい説明に整えています。コードは学習用の最小構成なので、業務アプリに組み込む場合は入力チェック、例外設計、ログ出力を追加するのが一般的です。

基本的な平方根の計算方法

平方根とは、ある数を二乗したときに元の数になる値です。たとえば9の平方根は3で、3を二乗すると9になります。

JavaではMath.sqrt(double a)が正の平方根を返すると理解できます。引数が9のような整数リテラルでも、計算時にはdoubleとして扱われ、戻り値も3.0のような小数表現になります。

一方、Math.pow(a, 0.5)でも平方根に近い計算はできますが、意図の読みやすさではMath.sqrt()が明確です。平方根を求めたい場面では、専用メソッドを選ぶほうが保守しやすくなります。

サンプルコード1:Math.sqrtメソッドを使用した基本的な計算

最初のサンプルコードは、数値9の平方根をMath.sqrt()で求めますが、これは押さえたい点です。Mathクラスはjava.langパッケージに含まれるため、通常はimportを書かずに利用できます。

public class SquareRootExample {
    public static void main(String[] args) {
        double number = 9;
        double squareRoot = Math.sqrt(number);
        System.out.println("平方根の計算結果は " + squareRoot + " です。");
    }
}

結果: 期待される出力は「平方根の計算結果は 3.0 です。」です。

このコードでは、numberに計算対象の値を入れ、squareRootに結果を保持しています。その後、System.out.println()で文字列と数値を連結して表示します。

そのため、プログラムの流れは「値を用意する」「平方根を計算する」「結果を表示する」という形になると覚えるとよいでしょう。プログラミング初心者は、変数名をnumbersquareRootのように意味のある名前にすると、処理の意図を追いやすくなります。

ただし、Math.sqrt()は実数計算なので、戻り値は整数ではありません。結果が整数に見える場合でも3.0のように表示される点を、平方根のサンプルコードを読むときに確認しておくとよいです。

サンプルコード2:独自関数を作成して平方根を計算

同じ平方根計算を複数の場所で使うなら、独自メソッドに切り出すと再利用しやすくなります。Javaではpublic static double calculateSquareRoot(double number)のように戻り値の型、メソッド名、引数を並べて定義すると考えられます。

この形にすると、呼び出し側はcalculateSquareRoot(number)だけを見れば目的を理解できます。内部でMath.sqrt()を使う実装でも、あとから入力チェックや丸め処理を追加しやすくなります。

public class SquareRootCalculator {

    public static void main(String[] args) {
        double number = 16;
        double result = calculateSquareRoot(number);
        System.out.println("平方根の計算結果は " + result + " です");
    }

    public static double calculateSquareRoot(double number) {
        return Math.sqrt(number);
    }
}

結果: 期待される出力は「平方根の計算結果は 4.0 です」です。

このサンプルコードでは、mainメソッドが処理全体の入口になり、calculateSquareRootメソッドが平方根を返します。returnの後にMath.sqrt(number)を書くことで、計算結果を呼び出し元へ渡しています。

その構造にしておくと、負数を受け取ったときの扱いをメソッド内に閉じ込められますし、これが一つの目安です。たとえばnumber < 0ならIllegalArgumentExceptionを投げる設計にすれば、呼び出し側が不正入力を見逃しにくくなります。

一方、学習段階では例外を増やすと読む情報が多くなります。最初はMath.sqrt()を包むだけの小さなメソッドで、クラス、メソッド、戻り値の関係を理解するのが現実的です。

サンプルコード3:BigIntegerクラスを使用した大きな数値の平方根計算

大きな整数を扱う場合は、longでも桁が足りないことがあると言えるでしょう。そのような値にはjava.math.BigIntegerを使い、任意精度整数として計算する方法があります。

ただし、元記事のコードはニュートン法で整数平方根を求める実装です。現在のJavaではBigInteger.sqrt()も利用できますが、公式ドキュメントによればBigInteger.sqrt()は整数平方根、つまりfloor(sqrt(n))に相当する値を返します。

これにより、実数としての平方根と整数平方根は同じではない場合があるのが基本です。サンプルコードを読むときは、少数部を切り捨てた整数解を求めているのか、実数の近似値を求めているのかを区別してください。

import java.math.BigInteger;

結果: 期待される状態は、BigIntegerクラスをソースコード内で参照できることです。

java.lang以外のパッケージにあるクラスは、通常importで読み込みます。BigIntegerjava.mathパッケージにあるため、ファイルの先頭にこの行を置きます。

BigInteger bigInt = new BigInteger("1234567890123456789");

結果: 期待される状態は、文字列から大きな整数を表すBigIntegerインスタンスが作成されることです。

この行では、数値をダブルクォートで囲んだStringとして渡しているのが目安です。巨大な整数リテラルをそのまま書くと型の範囲を超える可能性があるため、new BigInteger("...")の形がよく使われます。

public static BigInteger sqrt(BigInteger x) {
    BigInteger div = BigInteger.ZERO.setBit(x.bitLength()/2);
    BigInteger div2 = div;
    // Newton-Raphson法を利用
    for(; ; ) {
        BigInteger y = div.add(x.divide(div)).shiftRight(1);
        if(y.equals(div) || y.equals(div2))
            return y;
        div2 = div;
        div = y;
    }
}

結果: 期待される戻り値は、引数xに対する整数平方根です。

このメソッドでは、bitLength()から初期値を作り、divide()add()shiftRight(1)で近似値を更新しています。shiftRight(1)は2で割る操作に近く、ニュートン法の更新式を整数演算で表しています。

ただし、負数に対する入力チェックは入っていません。安全に使うなら、x.signum() < 0のときに例外を投げる、または呼び出し前に0以上であることを確認する設計が必要です。

public static void main(String[] args) {
    BigInteger bigInt = new BigInteger("1234567890123456789");
    BigInteger result = sqrt(bigInt);
    System.out.println("平方根の結果は: " + result);
}

結果: 期待される出力は「平方根の結果は: 1111111109」です。

このmainメソッドは、先ほどのsqrtメソッドを呼び出して結果を表示します。BigIntegerを扱うサンプルコードでは、変数の型をdoubleへ安易に変えないことが精度を保つポイントになります。

平方根の結果は: 1111111109

結果: 期待される表示例は、整数平方根として1111111109が出力される形です。

これは出力例をコードブロックとして示したものです。実際のプログラムでは、上のmainメソッドをクラスに含め、sqrtメソッドと同じファイル内でコンパイルできる状態にするのがポイントです。

⚠️ 注意: BigInteger.sqrt()が返すのは整数平方根です。小数部を含む平方根が必要な場合は、BigDecimalや数値解析ライブラリを含めて設計を分ける必要があります。

サンプルコード4:平方根の近似値を求めるアルゴリズム

平方根を自力で近似する代表的な計算方法に、ニュートン法があります。現在の近似値をapprox、平方根を求めたい値をaとし、誤差が十分に小さくなるまで値を更新するのが一般的です。

その考え方は、標準APIを使うだけでは見えにくい反復計算の学習に向いています。プログラミング初心者がwhile、条件式、変数の更新を理解する題材としても扱いやすいです。

[X_{n+1} = frac{1}{2} left(X_n + frac{A}{X_n}right)]

結果: 期待される意味は、現在の近似値X_nから新しい近似値X_{n+1}を計算する更新式です。

この式では、Aが平方根を求めたい値になります。近似値が解に近づくにつれて、approx * approxaの差が小さくなるのが現実的です。

public class SqrtApproximation {
    public static void main(String[] args) {
        double a = 2.0;
        double approx = 1.0;
        double epsilon = 0.0001;

        while(Math.abs(approx * approx - a) > epsilon) {
            approx = 0.5 * (approx + a / approx);
        }

        System.out.println("平方根の近似値: " + approx);
    }
}

結果: 期待される出力は「平方根の近似値: 1.4142156862745097」に近い値です。環境や停止条件により、表示される桁は変わる場合があります。

このサンプルコードでは、epsilonが許容誤差を表します。Math.abs(approx * approx - a)で現在の近似値を二乗した値と目標値の差を取り、その差がepsilon以下になるまで繰り返すると整理できます。

ただし、aが負数の場合、この近似計算は実数の範囲で意味を持ちません。a == 0の場合や初期値approxが0に近い場合も、割り算の安全性を考える必要があります。

一方、アルゴリズムの理解を目的とするなら、標準APIの内部を推測するより、更新式を自分のコードとして読めることに価値があります。徹底解説としては、Math.sqrt()を使う実務寄りの計算方法と、ニュートン法による学習用の計算方法を分けて覚えるのが自然です。

サンプルコード5:ストリームAPIを利用した平方根計算

複数の数値に対して同じ平方根計算を行うなら、Stream APIを使う書き方があると理解できます。List<Double>からstream()を作り、map(Math::sqrt)で各要素を変換します。

公式チュートリアルでは、Stream APIがメモリ上のデータをmapfilterreduceのような考え方で処理する仕組みとして説明されています。平方根の一括変換は、その入口として読みやすいサンプルコードです。

import java.util.List;
import java.util.stream.Collectors;

public class StreamAPISquareRoot {
    public static void main(String[] args) {
        List<Double> numbers = List.of(1.0, 4.0, 9.0, 16.0, 25.0);

        List<Double> squareRoots = numbers.stream()
                                           .map(Math::sqrt)
                                           .collect(Collectors.toList());

        squareRoots.forEach(System.out::println);
    }
}

結果: 期待される出力は、1.02.03.04.05.0が各行に表示される形です。

このコードでは、List.of()で数値のリストを作り、numbers.stream()でストリームに変換しています。map(Math::sqrt)は各要素にMath.sqrt()を適用する指定で、collect(Collectors.toList())が結果を新しいリストとして集めます。

その後のforEach(System.out::println)は、リストの各要素を順番に表示すると覚えるとよいでしょう。System.out::printlnもメソッド参照であり、x -> System.out.println(x)に近い意味として読めます。

一方、Streamは慣れるまで処理の流れが見えにくい場合があります。プログラミング初心者は、同じ処理をfor文で書いた場合と比較すると、mapが変換、collectが収集という役割を理解しやすくなると考えられます。

1.0
2.0
3.0
4.0
5.0

結果: 期待される表示例は、各入力値の平方根が1行ずつ並ぶ形です。

これは表示例を示すコードブロックです。実際に同じ出力を得るには、直前のStreamAPISquareRootクラスをコンパイルし、mainメソッドを実行する必要があります。

同じ集合処理を学ぶなら、Java List型完全ガイドListの基本を押さえると理解がつながります。平方根の計算方法そのものに加え、データをどう持つかが分かるとサンプルコードを応用しやすくなると言えるでしょう。

詳細な使い方と注意点

平方根の計算は短いコードで書けますが、入力値や型の選択を間違えると意図しない結果になります。特にJavaでは、NaN、浮動小数点誤差、整数平方根、オーバーフローを分けて扱う必要があります。

そのため、サンプルコードをコピーするだけでなく、どの場面で使うコードなのかを確認してください。単体の数値ならMath.sqrt()、共通化したいなら独自メソッド、大きな整数ならBigInteger、複数値ならStreamという整理ができるのが基本です。

各サンプルコードの適用シーン

Math.sqrtメソッドを使用した基本的な計算

Math.sqrt()は、通常の平方根計算で最も読みやすい選択肢です。doubleで扱える範囲の値なら、コード量が少なく、意図も明確になります。

ただし、負数を渡すとNaNになります。入力欄や外部ファイルから値を受け取る処理では、if (number < 0)のような条件分岐を置いて、エラー表示や再入力に進める設計が必要です。

独自関数を作成して平方根を計算

独自メソッドは、平方根の計算方法を一箇所に集めたいときに向いているのが目安です。calculateSquareRootのような名前を付けておくと、呼び出し側のコードから目的が読み取れます。

その設計では、Math.sqrt()を直接呼ぶだけでなく、負数チェック、丸め、ログ出力、例外変換などを追加できます。一方で、単発の計算しかない小さなコードでは、抽象化しすぎるとかえって読みにくくなる場合があるのがポイントです。

BigIntegerクラスを使用した大きな数値の平方根計算

BigIntegerは、intlongの範囲を超える整数を扱うためのクラスです。暗号、組み合わせ計算、桁数の大きい識別値など、通常のプリミティブ型では足りない場面で使われます。

一方、整数平方根は小数を含む平方根とは性質が異なります。BigInteger.sqrt()やニュートン法の整数実装を使う場合は、切り捨て後の整数値を求めていると理解してください。

平方根の近似値を求めるアルゴリズム

ニュートン法は、平方根の仕組みを学ぶための計算方法として扱いやすいです。whileで繰り返し、epsilonで停止条件を決めるため、制御構文と数値計算を同時に確認できるのが一般的です。

ただし、実用コードで平方根だけを求めるなら、標準APIを選ぶほうが読みやすい場面が多いです。近似アルゴリズムは、精度や収束条件を自分で管理する必要があるため、学習目的と実装目的を分けるのが無難です。

ストリームAPIを利用した平方根計算

Stream APIは、複数の値に同じ処理を流すときに適しています。平方根を求めたあとに、filterで条件を絞る、sortedで並べる、reduceで合計する、といった連鎖も可能です。

その反面、単純な繰り返しを学んでいる段階ではfor文のほうが状態を追いやすいことがあります。Streamは、コレクションの扱いに慣れてから導入すると理解しやすくなるのが現実的です。

平方根計算の際のエラー対処法

平方根のエラー対処では、計算前の入力チェックが中心になります。JavaのMath.sqrt()は負数でも例外を投げないため、呼び出し側がDouble.isNaN()で結果を判定するか、事前に負数を弾く必要があります。

これに対して、BigInteger.sqrt()は負数でArithmeticExceptionを投げますが、覚えておくと役立つでしょう。同じ平方根でもAPIごとにふるまいが異なるため、公式ドキュメントを見て例外や戻り値を確認する習慣が役立ちます。

負の数値の平方根計算

実数の範囲では、負の数の平方根は通常のdouble値として表せません。Math.sqrt(-1.0)NaNを返すため、計算後にそのまま画面へ出すと利用者に意味が伝わりにくくなります。

そのため、入力が0以上であるかを先に確認し、不正な場合はエラーメッセージや再入力に進める設計が考えられますし、ここを基本と考えるとよいでしょう。複素数として扱いたい場合は、標準のMath.sqrt()だけではなく、複素数を表す型やライブラリの検討が必要です。

計算精度の問題

doubleは浮動小数点数なので、すべての小数を正確に表せるわけではありません。平方根の結果を比較するときにresult == expectedのような等価比較を使うと、誤差によって期待と違う判定になる場合があります。

このときは、Math.abs(result - expected) < epsilonのように差分で比較します。表示だけ整えたい場合はString.format()printfを使い、計算値そのものと表示形式を分離すると整理しやすいです。

オーバーフローやアンダーフロー

平方根そのものは値を小さくする方向の計算ですが、検算でresult * resultを行うと大きな数ではオーバーフローが起こる可能性があると整理できます。intlongの範囲を超える値を扱うなら、BigIntegerの利用を検討します。

一方、極端に小さい小数では、精度や丸めの影響が目立つ場合があります。科学技術計算や金融計算のように精度要件が明確な処理では、型選択と誤差許容範囲を仕様として決める必要があると理解できます。

ℹ️ 補足: Javaの周辺構文を同時に確認するなら、Javaエスケープ処理の10ステップマスターガイドで文字列リテラルの扱いを確認できます。平方根の出力文を組み立てるときにも、引用符や改行の知識が役立ちます。

カスタマイズと応用例

平方根の基本が分かったら、入力値の受け取り方、結果の表示形式、複数値の処理を変えることで応用できると覚えるとよいでしょう。Javaでは、同じMath.sqrt()を使っていても、メソッド化やStream化によってコードの見通しが大きく変わります。

具体的には、単体の計算を関数化する、負数を弾く、List内の値をまとめて変換する、結果を小数第2位で表示する、といったカスタマイズが考えられます。サンプルコードの形を保ちながら、必要な責務だけを足すのが保守しやすい作り方です。

カスタマイズ方法の詳細解説

カスタマイズで特に押さえたいのは、計算処理と表示処理を混ぜすぎないことです。calculateSquareRootは数値を返し、System.out.println()は呼び出し側で行うように分けると、テストや再利用がしやすくなると考えられます。

その設計では、返されたdoubleを画面表示、ファイル出力、APIレスポンスなど別の用途に回せます。平方根の計算方法を徹底解説するうえでも、計算そのものと結果の見せ方を分離する考え方は欠かせません。

ただし、プログラミング初心者が最初から層を細かく分けすぎると、ファイルやクラスの数が増えて追いにくくなります。小さなサンプルコードでは1ファイルに収め、理解が進んだらメソッドやクラスを分ける進め方が扱いやすいです。

応用例とサンプルコード:複数の数値の平方根を計算するプログラム

複数の数値をまとめて処理する応用例では、List<Double>Stream APIを組み合わせますし、ここがポイントです。元の数値リストを変えずに、平方根だけを集めた新しいリストを作ると、入力と出力の関係が明確になります。

このサンプルコードは、numbersに入った値へMath::sqrtを適用し、結果をsquareRootsへ集めます。Collectors.toList()はJava 8以降で広く使われてきた収集方法です。

import java.util.List;
import java.util.stream.Collectors;

public class SquareRootCalculator {
    public static void main(String[] args) {
        List<Double> numbers = List.of(1.0, 4.0, 9.0, 16.0, 25.0);

        List<Double> squareRoots = numbers.stream()
                                           .map(Math::sqrt)
                                           .collect(Collectors.toList());

        squareRoots.forEach(System.out::println);
    }
}

結果: 期待される出力は、1.02.03.04.05.0が順番に表示される形です。

この応用例では、mapの中にMath::sqrtを置くことで、各要素に同じ計算を適用しています。匿名関数で書くならx -> Math.sqrt(x)となり、メソッド参照はそれを短く表した書き方です。

そのため、後から負数を除外したい場合は、filter(x -> x >= 0)mapの前に挟めます。出力を整えたい場合は、forEach内でSystem.out.printf("%.2f%n", value)のように表示形式を変える選択肢もあると言えるでしょう。

一方、学習目的で処理の順番を細かく追いたいなら、同じ処理をfor文で書く練習も有効です。Streamは読みやすい反面、途中の値をデバッグ表示したいときにはpeekの使い方やログの方針も考える必要があります。

関連して、メソッドの上書きや多態性を学ぶなら、Javaでマスターする!オーバーライドのたった7つのステップが参考になります。平方根計算をサービスクラスへ分ける段階では、インターフェースや実装差し替えの考え方も関係するのが基本です。

同様に、入力ルールを明示したい場合は、Javaアノテーションの12選!初心者から上級者まで徹底ガイドでアノテーションの用途を確認できます。平方根の値検証そのものは標準アノテーションだけで完結しない場合もありますが、制約をコード上に表す考え方は近いです。

数値条件を扱う別題材としては、Javaでうるう年を判定!初心者でも分かる9ステップ解説も条件分岐の練習になります。平方根の負数チェックと同じく、入力値を判定して処理を切り替える構造を学べますが、これは押さえたい点です。

💡 Tips: サンプルコードを応用するときは、入力、計算、出力の責務を分けてから変更すると、平方根以外の数値処理にも流用しやすくなります。

まとめ

Javaで平方根を計算する中心はMath.sqrt()です。通常のdouble値を扱うなら、短いサンプルコードで結果まで確認でき、プログラミング初心者にも流れを追いやすい書き方になります。

ただし、入力値が負数ならNaN、巨大な整数ならBigInteger、複数値ならStream APIというように、計算方法は条件で変わりますし、これが一つの目安です。徹底解説として押さえるべき点は、API名を暗記することより、数値型と結果の性質を見分けることです。

そのうえで、独自メソッド化すると再利用しやすくなり、ニュートン法を読むと近似計算の流れも理解できます。サンプルコードは小さく保ち、必要に応じて入力チェック、例外処理、表示形式、リスト処理を足していくと、実用的な形へ発展させやすくなります。

これらの内容を押さえると、平方根だけでなく、絶対値、べき乗、丸め、統計処理などの数値計算にも応用できるのが目安です。Javaの標準ライブラリを起点に、用途に合う型とAPIを選ぶ姿勢が、安定したプログラム作成につながります。

関連記事

著者: Japanシーモア編集部

Japanシーモアは、Web/IoT/APP/SYS 分野のプログラミング情報を体系的に提供するメディアです。本記事は編集部による執筆とAI支援を組み合わせて制作し、公開前に編集部が校正しています。誤りや改善案がございましたらお問い合わせよりご連絡ください。

※本記事は実在のエンジニア複数名で構成される Japanシーモア編集部が、AI支援を活用して作成・校正・公開しています。