C# Mathの使い方完全ガイド|計算・四捨五入・最大値・平方根を初心者向けに解説
はじめに
C#で数値計算を行うときによく使うのが、Mathクラスです。Mathクラスを使うと、絶対値、平方根、べき乗、最大値、最小値、四捨五入、切り上げ、切り捨て、三角関数など、さまざまな数学的な処理を簡単に書けます。
たとえば、次のような計算をしたい場面で役立ちます。
C#double result = Math.Sqrt(16);
Console.WriteLine(result); // 4
自分で計算式を書くこともできますが、C#に標準で用意されているMathクラスを使うことで、読みやすく、ミスの少ないコードを書きやすくなります。
この記事では、C#のMathクラスについて、初心者にもわかりやすいように基本から実践例まで解説します。四捨五入、最大値、平方根、べき乗、三角関数、Math.Roundの注意点など、実務でもよく使う内容をまとめて理解できるように説明します。
1. C#のMathクラスとは?初心者向けに基本を解説
C#のMathクラスは、数学的な計算を行うために用意されているクラスです。System名前空間に含まれており、数値計算でよく使うメソッドや定数がまとめられています。
Microsoftの公式ドキュメントでも、Mathクラスは三角関数、対数関数、その他の一般的な数学関数の定数と静的メソッドを提供するクラスとして説明されています。
1-1. Mathクラスでできること
Mathクラスを使うと、次のような処理ができます。
C#int abs = Math.Abs(-10); // 絶対値
double pow = Math.Pow(2, 3); // べき乗
double sqrt = Math.Sqrt(25); // 平方根
int max = Math.Max(10, 20); // 最大値
int min = Math.Min(10, 20); // 最小値
double round = Math.Round(3.14); // 丸め
Mathクラスでは、単純な足し算や引き算ではなく、少し複雑な数学的処理を簡単に扱えます。
たとえば、平方根を自分で計算するのは面倒ですが、Math.Sqrtを使えば1行で書けます。
C#double value = Math.Sqrt(81);
Console.WriteLine(value); // 9
ゲーム開発、業務システム、金額計算、グラフ描画、座標計算、統計処理など、C#で数値を扱う多くの場面でMathクラスは使われます。
1-2. Mathクラスを使うメリット
Mathクラスを使う主なメリットは、コードがわかりやすくなることです。
たとえば、2の3乗を計算する場合、次のように書くこともできます。
C#int result = 2 * 2 * 2;
しかし、指数が変わる場合や、より汎用的に書きたい場合はMath.Powを使ったほうが意図が明確です。
C#double result = Math.Pow(2, 3);
また、Math.SqrtやMath.Sinのようなメソッドは、自分で正確に実装するのが難しい処理です。標準ライブラリを使うことで、信頼性の高い計算処理を簡潔に書けます。
さらに、他の開発者がコードを読んだときにも、Math.Maxなら「最大値を求めている」、Math.Roundなら「丸め処理をしている」とすぐに理解できます。
1-3. Mathクラスを使うための基本構文
Mathクラスの基本構文は次のとおりです。
C#Math.メソッド名(引数);
たとえば、絶対値を求める場合は次のように書きます。
C#int number = -100;
int result = Math.Abs(number);
Console.WriteLine(result); // 100
Mathクラスのメソッドは、基本的にインスタンスを作らずに呼び出します。
つまり、次のようにnew Math()のような書き方はしません。
C#// このような使い方はしない
// Math math = new Math();
Math.Abs、Math.Sqrt、Math.Roundのように、クラス名から直接呼び出します。
1-4. using Systemは必要?名前空間の考え方
MathクラスはSystem名前空間にあります。そのため、通常はファイルの先頭に次のように書きます。
C#using System;
そのうえで、次のようにMathクラスを使います。
C#using System;
class Program
{
static void Main()
{
double result = Math.Sqrt(64);
Console.WriteLine(result);
}
}
もしusing System;を書かない場合は、次のように完全修飾名で書くこともできます。
C#double result = System.Math.Sqrt(64);
ただし、毎回System.Mathと書くとコードが長くなるため、通常はusing System;を使います。
最近のC#プロジェクトでは、テンプレートによって暗黙的にSystemが読み込まれている場合もあります。その場合、using System;を書かなくてもMathやConsoleを使えることがあります。ただし、初心者のうちはusing System;を書いておくと、どの名前空間を使っているのか理解しやすくなります。
2. C# Mathでよく使う計算メソッド一覧
ここでは、C#のMathクラスで特によく使うメソッドを紹介します。
2-1. Math.Absで絶対値を求める
Math.Absは、数値の絶対値を求めるメソッドです。
絶対値とは、数値から符号を取り除いた値のことです。たとえば、-10の絶対値は10です。
C#int value = -10;
int result = Math.Abs(value);
Console.WriteLine(result); // 10
double型でも使えます。
C#double value = -12.34;
double result = Math.Abs(value);
Console.WriteLine(result); // 12.34
座標計算や差分計算では、値がプラスかマイナスかではなく「どれくらい離れているか」を知りたいことがあります。そのような場面でMath.Absが便利です。
C#int a = 50;
int b = 80;
int diff = Math.Abs(a - b);
Console.WriteLine(diff); // 30
2-2. Math.Powでべき乗を計算する
Math.Powは、べき乗を計算するメソッドです。
C#double result = Math.Pow(2, 3);
Console.WriteLine(result); // 8
この例では、2の3乗を計算しています。
C#// 2 × 2 × 2 = 8
第1引数に底、第2引数に指数を指定します。
C#Math.Pow(底, 指数);
たとえば、10の2乗を計算する場合は次のように書きます。
C#double result = Math.Pow(10, 2);
Console.WriteLine(result); // 100
Math.Powの戻り値はdoubleです。そのため、整数として使いたい場合は型変換が必要になることがあります。
C#int result = (int)Math.Pow(2, 4);
Console.WriteLine(result); // 16
ただし、小数や大きな数を扱う場合は、安易なキャストによって小数部分が失われたり、意図しない値になったりする可能性があるため注意しましょう。
2-3. Math.Sqrtで平方根を求める
Math.Sqrtは、平方根を求めるメソッドです。
平方根とは、2乗すると元の数になる値です。たとえば、9の平方根は3です。
C#double result = Math.Sqrt(9);
Console.WriteLine(result); // 3
25の平方根は5です。
C#double result = Math.Sqrt(25);
Console.WriteLine(result); // 5
平方根は、距離計算でよく使います。たとえば、2点間の距離を求めるときは、三平方の定理を使って次のように書けます。
C#double x1 = 0;
double y1 = 0;
double x2 = 3;
double y2 = 4;
double distance = Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2));
Console.WriteLine(distance); // 5
2-4. Math.Maxで最大値を取得する
Math.Maxは、2つの数値のうち大きいほうを返します。
C#int result = Math.Max(10, 20);
Console.WriteLine(result); // 20
変数同士を比較することもできます。
C#int scoreA = 85;
int scoreB = 92;
int highScore = Math.Max(scoreA, scoreB);
Console.WriteLine(highScore); // 92
条件分岐で書くこともできますが、Math.Maxを使うと簡潔です。
C#int highScore;
if (scoreA > scoreB)
{
highScore = scoreA;
}
else
{
highScore = scoreB;
}
上の処理は、次の1行で書けます。
C#int highScore = Math.Max(scoreA, scoreB);
2-5. Math.Minで最小値を取得する
Math.Minは、2つの数値のうち小さいほうを返します。
C#int result = Math.Min(10, 20);
Console.WriteLine(result); // 10
価格、点数、温度、在庫数など、2つの値を比較して小さいほうを使いたい場合に便利です。
C#int stockA = 15;
int stockB = 8;
int minStock = Math.Min(stockA, stockB);
Console.WriteLine(minStock); // 8
2-6. Math.Signで数値の符号を判定する
Math.Signは、数値が正の数か、負の数か、0かを判定するメソッドです。
戻り値は次のようになります。
C#Console.WriteLine(Math.Sign(10)); // 1
Console.WriteLine(Math.Sign(-10)); // -1
Console.WriteLine(Math.Sign(0)); // 0
戻り値の意味は次のとおりです。
| 戻り値 | 意味 |
|---|---|
1 | 正の数 |
-1 | 負の数 |
0 | 0 |
たとえば、入力された数値がプラスかマイナスかを判定したい場合に使えます。
C#int value = -50;
int sign = Math.Sign(value);
if (sign > 0)
{
Console.WriteLine("正の数です");
}
else if (sign < 0)
{
Console.WriteLine("負の数です");
}
else
{
Console.WriteLine("0です");
}
3. C# Mathで四捨五入・切り上げ・切り捨てを行う方法
C#で小数を扱うとき、四捨五入、切り上げ、切り捨てはよく使います。Mathクラスには、丸め処理に使えるメソッドが複数あります。
代表的なメソッドは次のとおりです。
| メソッド | 処理内容 |
|---|---|
Math.Round | 丸める |
Math.Ceiling | 切り上げる |
Math.Floor | 切り捨てる |
Math.Truncate | 小数部分を取り除く |
3-1. Math.Roundで四捨五入する
Math.Roundは、数値を丸めるメソッドです。
C#double value = 3.6;
double result = Math.Round(value);
Console.WriteLine(result); // 4
3.4の場合は次のようになります。
C#double value = 3.4;
double result = Math.Round(value);
Console.WriteLine(result); // 3
ただし、Math.Roundを単純に「一般的な四捨五入」と考えると、期待と違う結果になる場合があります。特に.5の扱いには注意が必要です。
C#Console.WriteLine(Math.Round(2.5)); // 2
Console.WriteLine(Math.Round(3.5)); // 4
この理由は、後ほど「銀行丸め」として詳しく解説します。
3-2. Math.Ceilingで切り上げる
Math.Ceilingは、指定した数値以上の最小の整数値を返します。つまり、小数点以下がある場合は切り上げます。
C#double value = 3.1;
double result = Math.Ceiling(value);
Console.WriteLine(result); // 4
3.9でも結果は4です。
C#Console.WriteLine(Math.Ceiling(3.9)); // 4
負の数の場合は注意が必要です。
C#Console.WriteLine(Math.Ceiling(-3.1)); // -3
-3.1以上の整数のうち最小の値は-3なので、結果は-3になります。
3-3. Math.Floorで切り捨てる
Math.Floorは、指定した数値以下の最大の整数値を返します。
C#double value = 3.9;
double result = Math.Floor(value);
Console.WriteLine(result); // 3
正の数では、一般的な「小数点以下を切り捨てる」動きに見えます。
C#Console.WriteLine(Math.Floor(3.1)); // 3
Console.WriteLine(Math.Floor(3.9)); // 3
しかし、負の数では結果が変わります。
C#Console.WriteLine(Math.Floor(-3.1)); // -4
-3.1以下の整数のうち最大の値は-4です。そのため、負の数ではMath.FloorとMath.Truncateの結果が異なることがあります。
3-4. Math.Truncateで小数部分を切り捨てる
Math.Truncateは、小数部分を取り除くメソッドです。
C#double value = 3.9;
double result = Math.Truncate(value);
Console.WriteLine(result); // 3
正の数ではMath.Floorと同じ結果になることが多いです。
C#Console.WriteLine(Math.Floor(3.9)); // 3
Console.WriteLine(Math.Truncate(3.9)); // 3
しかし、負の数では結果が異なります。
C#Console.WriteLine(Math.Floor(-3.9)); // -4
Console.WriteLine(Math.Truncate(-3.9)); // -3
Math.Truncateは、数値を0に近づける方向で小数部分を取り除きます。そのため、負の数ではMath.Floorとは違う結果になります。
3-5. Math.Roundの注意点:銀行丸めとは
Math.Roundで特に注意したいのが、.5の丸め方です。
C#のMath.Roundは、既定では「銀行丸め」と呼ばれる方式を使います。これは、ちょうど中間の値を丸めるときに、最も近い偶数へ丸める方式です。公式ドキュメントでも、Roundの丸め処理にはMidpointRoundingを指定でき、既定の丸め方式に注意が必要です。
たとえば、次の結果を見てください。
C#Console.WriteLine(Math.Round(1.5)); // 2
Console.WriteLine(Math.Round(2.5)); // 2
Console.WriteLine(Math.Round(3.5)); // 4
Console.WriteLine(Math.Round(4.5)); // 4
一般的な感覚では、2.5は3になりそうですが、既定では偶数である2に丸められます。
一般的な「0.5以上は切り上げ」に近い処理をしたい場合は、MidpointRounding.AwayFromZeroを指定します。
C#Console.WriteLine(Math.Round(2.5, MidpointRounding.AwayFromZero)); // 3
Console.WriteLine(Math.Round(3.5, MidpointRounding.AwayFromZero)); // 4
金額計算などで「四捨五入」として期待される動作を明確にしたい場合は、丸め方式を指定することをおすすめします。
3-6. 小数点以下の桁数を指定して丸める方法
Math.Roundでは、小数点以下の桁数を指定できます。
C#double value = 3.14159;
double result = Math.Round(value, 2);
Console.WriteLine(result); // 3.14
第2引数に桁数を指定します。
C#Math.Round(値, 小数点以下の桁数);
小数点以下1桁に丸める場合は次のように書きます。
C#double value = 123.456;
double result = Math.Round(value, 1);
Console.WriteLine(result); // 123.5
丸め方式も同時に指定できます。
C#double value = 2.345;
double result = Math.Round(value, 2, MidpointRounding.AwayFromZero);
Console.WriteLine(result); // 2.35
金額や表示用の数値を整えるときによく使います。
4. C# Mathで最大値・最小値を求める方法
最大値と最小値の取得は、C#の数値計算で非常によく使う処理です。Math.MaxとMath.Minを使えば、2つの数値の比較を簡単に書けます。
4-1. Math.Maxの基本的な使い方
Math.Maxは、2つの値のうち大きいほうを返します。
C#int a = 10;
int b = 20;
int result = Math.Max(a, b);
Console.WriteLine(result); // 20
doubleでも使えます。
C#double a = 12.5;
double b = 9.8;
double result = Math.Max(a, b);
Console.WriteLine(result); // 12.5
最大値を上限値として扱いたい場合にも便利です。
C#int currentHp = 120;
int maxHp = 100;
currentHp = Math.Min(currentHp, maxHp);
Console.WriteLine(currentHp); // 100
この例では、HPが最大値を超えないようにしています。
4-2. Math.Minの基本的な使い方
Math.Minは、2つの値のうち小さいほうを返します。
C#int a = 10;
int b = 20;
int result = Math.Min(a, b);
Console.WriteLine(result); // 10
たとえば、割引後の価格が0円未満にならないようにしたい場合は、Math.Maxと組み合わせて使えます。
C#int price = 500;
int discount = 800;
int finalPrice = Math.Max(price - discount, 0);
Console.WriteLine(finalPrice); // 0
price - discountは-300ですが、Math.Max(-300, 0)によって、最終価格を0未満にしないようにしています。
4-3. int・double・decimalで使う場合の違い
Math.MaxやMath.Minは、int、double、decimalなど複数の数値型に対応しています。Mathクラスには多くの数値型向けのオーバーロードが用意されています。
intの場合は整数を扱います。
C#int result = Math.Max(10, 20);
Console.WriteLine(result); // 20
doubleの場合は小数を扱えます。
C#double result = Math.Max(10.5, 20.3);
Console.WriteLine(result); // 20.3
decimalの場合は、金額計算などで使われることが多いです。
C#decimal priceA = 1200.50m;
decimal priceB = 980.75m;
decimal result = Math.Max(priceA, priceB);
Console.WriteLine(result); // 1200.50
decimalの値には末尾にmを付けます。
C#decimal price = 1000.5m;
金額のように誤差を避けたい計算ではdecimal、物理計算や座標計算などではdoubleが使われることが多いです。
4-4. 3つ以上の数値から最大値・最小値を求める方法
Math.MaxとMath.Minは、基本的に2つの値を比較するメソッドです。
3つ以上の値を比較したい場合は、入れ子にして使えます。
C#int a = 10;
int b = 30;
int c = 20;
int max = Math.Max(a, Math.Max(b, c));
Console.WriteLine(max); // 30
最小値も同じように書けます。
C#int min = Math.Min(a, Math.Min(b, c));
Console.WriteLine(min); // 10
ただし、値が多くなると読みづらくなります。
C#int max = Math.Max(a, Math.Max(b, Math.Max(c, d)));
このような場合は、配列やリストにしてLINQのMaxやMinを使うほうがわかりやすいです。
4-5. 配列やリストの最大値・最小値を求める場合
配列やリストの最大値・最小値を求める場合は、Math.MaxやMath.Minではなく、LINQのMaxやMinを使うのが一般的です。
C#using System;
using System.Linq;
class Program
{
static void Main()
{
int[] numbers = { 10, 30, 20, 50, 40 };
int max = numbers.Max();
int min = numbers.Min();
Console.WriteLine(max); // 50
Console.WriteLine(min); // 10
}
}
リストでも同じように使えます。
C#using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
List<int> scores = new List<int> { 80, 95, 70, 88 };
int max = scores.Max();
int min = scores.Min();
Console.WriteLine(max); // 95
Console.WriteLine(min); // 70
}
}
2つの値だけを比較するならMath.MaxとMath.Min、配列やリスト全体から最大値・最小値を求めるならLINQのMaxとMinを使う、と覚えておくとよいでしょう。
5. C# Mathで平方根・べき乗・三角関数を使う方法
Mathクラスでは、平方根やべき乗だけでなく、三角関数も扱えます。座標計算、図形計算、ゲーム開発、物理演算などでよく使います。
5-1. Math.Sqrtで平方根を計算する
Math.Sqrtは平方根を求めます。
C#double result = Math.Sqrt(16);
Console.WriteLine(result); // 4
平方根は、距離を求めるときによく使います。
たとえば、直角三角形の斜辺を求める場合は次のように書けます。
C#double width = 3;
double height = 4;
double hypotenuse = Math.Sqrt(width * width + height * height);
Console.WriteLine(hypotenuse); // 5
Math.Powを使って次のように書くこともできます。
C#double hypotenuse = Math.Sqrt(Math.Pow(width, 2) + Math.Pow(height, 2));
ただし、2乗程度であればwidth * widthのほうがシンプルで高速に書けることもあります。
5-2. Math.Powで累乗を計算する
Math.Powは累乗を計算します。
C#double result = Math.Pow(5, 2);
Console.WriteLine(result); // 25
3乗も計算できます。
C#double result = Math.Pow(2, 3);
Console.WriteLine(result); // 8
指数に小数を指定することもできます。
C#double result = Math.Pow(9, 0.5);
Console.WriteLine(result); // 3
0.5乗は平方根と同じ意味になります。ただし、平方根を求めたい場合は、意図が明確なMath.Sqrtを使うほうが読みやすいです。
C#double result = Math.Sqrt(9);
5-3. Math.Sin・Math.Cos・Math.Tanの使い方
Math.Sin、Math.Cos、Math.Tanは三角関数を扱うメソッドです。
C#double angle = Math.PI / 2;
double sin = Math.Sin(angle);
double cos = Math.Cos(angle);
double tan = Math.Tan(angle);
Console.WriteLine(sin); // 1に近い値
Console.WriteLine(cos); // 0に近い値
Console.WriteLine(tan); // 非常に大きな値になることがある
ここで重要なのは、C#の三角関数では角度を「度」ではなく「ラジアン」で指定することです。
たとえば、90度をそのままMath.Sin(90)と書くのは正しくありません。
C#double wrong = Math.Sin(90);
90度をラジアンに変換してから渡す必要があります。
C#double degrees = 90;
double radians = degrees * Math.PI / 180;
double result = Math.Sin(radians);
Console.WriteLine(result); // 1
5-4. 角度とラジアンの違い
角度には「度」と「ラジアン」という表し方があります。
日常的には、90度、180度、360度のように「度」を使うことが多いです。一方、C#のMath.Sin、Math.Cos、Math.Tanなどではラジアンを使います。
度からラジアンに変換する式は次のとおりです。
C#ラジアン = 度 * Math.PI / 180
コードでは次のように書きます。
C#double degrees = 180;
double radians = degrees * Math.PI / 180;
Console.WriteLine(radians); // 3.141592653589793
ラジアンから度に戻す場合は、次の式を使います。
C#度 = ラジアン * 180 / Math.PI
コードでは次のようになります。
C#double radians = Math.PI;
double degrees = radians * 180 / Math.PI;
Console.WriteLine(degrees); // 180
ゲーム開発や図形計算では、角度をラジアンに変換してから三角関数に渡す処理がよく出てきます。
5-5. Math.PIを使った円周率の計算例
Math.PIは円周率を表す定数です。円の面積や円周を求めるときに使います。
円の面積は次の式で求められます。
C#面積 = 半径 × 半径 × 円周率
C#では次のように書けます。
C#double radius = 5;
double area = radius * radius * Math.PI;
Console.WriteLine(area); // 78.53981633974483
円周は次の式です。
C#円周 = 2 × 半径 × 円周率
コードでは次のようになります。
C#double radius = 5;
double circumference = 2 * radius * Math.PI;
Console.WriteLine(circumference); // 31.41592653589793
3.14を直接書くこともできますが、Math.PIを使ったほうが正確で、コードの意味もわかりやすくなります。
6. C# Mathの定数と便利なプロパティ
Mathクラスには、メソッドだけでなく数学でよく使う定数も用意されています。代表的なものはMath.PIとMath.Eです。公式ドキュメントでも、MathクラスのフィールドとしてEやPIなどが定義されています。
6-1. Math.PIで円周率を使う
Math.PIは円周率を表します。
C#Console.WriteLine(Math.PI);
出力例は次のようになります。
C#3.141592653589793
円周率を使う処理では、3.14のように直接書くよりもMath.PIを使うほうが適切です。
C#double radius = 10;
double area = radius * radius * Math.PI;
Console.WriteLine(area);
マジックナンバーを避ける意味でも、Math.PIを使うとコードの意図が伝わりやすくなります。
6-2. Math.Eで自然対数の底を使う
Math.Eは、自然対数の底を表す定数です。
C#Console.WriteLine(Math.E);
出力例は次のようになります。
C#2.718281828459045
Math.Eは、指数関数や対数計算、統計、科学技術計算などで使われます。
たとえば、eの2乗を計算する場合は次のように書けます。
C#double result = Math.Pow(Math.E, 2);
Console.WriteLine(result);
ただし、通常はeの累乗を計算したい場合、Math.Expを使うこともあります。
C#double result = Math.Exp(2);
Console.WriteLine(result);
6-3. 定数を使った円の面積・円周の計算例
Math.PIを使って、円の面積と円周を求めるサンプルを見てみましょう。
C#using System;
class Program
{
static void Main()
{
double radius = 7.5;
double area = Math.PI * radius * radius;
double circumference = 2 * Math.PI * radius;
Console.WriteLine($"半径: {radius}");
Console.WriteLine($"面積: {area}");
Console.WriteLine($"円周: {circumference}");
}
}
小数点以下2桁に丸めたい場合は、Math.Roundを組み合わせます。
C#double roundedArea = Math.Round(area, 2);
double roundedCircumference = Math.Round(circumference, 2);
Console.WriteLine($"面積: {roundedArea}");
Console.WriteLine($"円周: {roundedCircumference}");
表示用に整えるだけなら、文字列フォーマットを使う方法もあります。
C#Console.WriteLine($"面積: {area:F2}");
Console.WriteLine($"円周: {circumference:F2}");
Math.Roundは数値自体を丸めたい場合、F2のようなフォーマット指定は表示だけを整えたい場合に使うとよいでしょう。
7. C# Mathを使った実践的なサンプルコード
ここからは、実際の開発で使いやすいMathクラスのサンプルコードを紹介します。
7-1. 消費税込み価格を四捨五入で計算する
商品価格に消費税を加えて、税込価格を計算する例です。
C#using System;
class Program
{
static void Main()
{
decimal price = 1980m;
decimal taxRate = 0.10m;
decimal taxIncluded = price * (1 + taxRate);
decimal roundedPrice = Math.Round(taxIncluded, 0, MidpointRounding.AwayFromZero);
Console.WriteLine($"税込価格: {roundedPrice}円");
}
}
金額計算では、doubleよりもdecimalが使われることが多いです。decimalは10進数の計算に向いているため、金額のように誤差を避けたい処理で便利です。
MidpointRounding.AwayFromZeroを指定しているため、一般的な「0.5以上を切り上げる」丸め方に近い動きになります。
7-2. 2点間の距離を平方根で求める
2点間の距離を求めるには、三平方の定理を使います。
C#using System;
class Program
{
static void Main()
{
double x1 = 1;
double y1 = 2;
double x2 = 4;
double y2 = 6;
double dx = x2 - x1;
double dy = y2 - y1;
double distance = Math.Sqrt(dx * dx + dy * dy);
Console.WriteLine($"距離: {distance}");
}
}
この例では、点(1, 2)と点(4, 6)の距離を求めています。
dxは横方向の差、dyは縦方向の差です。
C#double distance = Math.Sqrt(dx * dx + dy * dy);
これは次の式をC#で表したものです。
C#距離 = √((x2 - x1)^2 + (y2 - y1)^2)
ゲーム開発でキャラクター同士の距離を求めたり、地図アプリで位置の差を計算したりするときに使える考え方です。
7-3. 入力値の最大値・最小値を判定する
3つの点数から最大値と最小値を求める例です。
C#using System;
class Program
{
static void Main()
{
int score1 = 78;
int score2 = 92;
int score3 = 85;
int max = Math.Max(score1, Math.Max(score2, score3));
int min = Math.Min(score1, Math.Min(score2, score3));
Console.WriteLine($"最大値: {max}");
Console.WriteLine($"最小値: {min}");
}
}
3つ程度であれば、Math.MaxやMath.Minを入れ子にしても問題ありません。
値が多くなる場合は、配列とLINQを使うほうが読みやすくなります。
C#using System;
using System.Linq;
class Program
{
static void Main()
{
int[] scores = { 78, 92, 85, 64, 100 };
Console.WriteLine($"最大値: {scores.Max()}");
Console.WriteLine($"最小値: {scores.Min()}");
}
}
7-4. 小数点以下を指定して金額を整形する
小数点以下2桁に丸めて表示する例です。
C#using System;
class Program
{
static void Main()
{
decimal price = 1234.567m;
decimal rounded = Math.Round(price, 2, MidpointRounding.AwayFromZero);
Console.WriteLine(rounded); // 1234.57
}
}
表示だけを小数点以下2桁にしたい場合は、フォーマット指定も使えます。
C#decimal price = 1234.5m;
Console.WriteLine($"{price:F2}"); // 1234.50
Math.Roundは値そのものを丸める処理、F2は表示形式を整える処理です。用途によって使い分けましょう。
7-5. ゲーム開発で使えるランダムな距離計算の例
ゲームでは、キャラクターと敵の距離を計算して、攻撃範囲内かどうかを判定することがあります。
C#using System;
class Program
{
static void Main()
{
double playerX = 10;
double playerY = 20;
double enemyX = 13;
double enemyY = 24;
double attackRange = 5;
double dx = enemyX - playerX;
double dy = enemyY - playerY;
double distance = Math.Sqrt(dx * dx + dy * dy);
if (distance <= attackRange)
{
Console.WriteLine("攻撃できます");
}
else
{
Console.WriteLine("距離が遠すぎます");
}
Console.WriteLine($"距離: {distance}");
}
}
この例では、プレイヤーと敵の距離がattackRange以下であれば攻撃可能と判定しています。
さらに、敵の位置をランダムにしたい場合はRandomクラスを使います。
C#using System;
class Program
{
static void Main()
{
Random random = new Random();
double playerX = 0;
double playerY = 0;
double enemyX = random.Next(0, 11);
double enemyY = random.Next(0, 11);
double distance = Math.Sqrt(
Math.Pow(enemyX - playerX, 2) +
Math.Pow(enemyY - playerY, 2)
);
Console.WriteLine($"敵の位置: ({enemyX}, {enemyY})");
Console.WriteLine($"距離: {distance}");
}
}
乱数を作るのはMathクラスではなくRandomクラスです。Mathは距離計算や丸め処理などに使います。
8. C# Mathを使うときの注意点
Mathクラスは便利ですが、型変換、丸め方式、計算誤差などに注意が必要です。
8-1. intとdoubleの型変換に注意する
Math.SqrtやMath.Powの戻り値はdoubleです。
C#double result = Math.Sqrt(16);
そのため、int変数にそのまま代入することはできません。
C#// エラーになる
// int result = Math.Sqrt(16);
整数として扱いたい場合は、明示的にキャストします。
C#int result = (int)Math.Sqrt(16);
Console.WriteLine(result); // 4
ただし、キャストすると小数部分は切り捨てられます。
C#int result = (int)Math.Sqrt(20);
Console.WriteLine(result); // 4
Math.Sqrt(20)は約4.4721ですが、intにキャストすると4になります。
小数部分が必要な場合は、doubleのまま扱いましょう。
8-2. decimalとdoubleの使い分け
C#で小数を扱う型には、主にdoubleとdecimalがあります。
doubleは科学技術計算、座標計算、物理計算などでよく使われます。扱える範囲が広く、計算速度も速い傾向があります。
一方、decimalは金額計算など、10進数としての正確さが重視される場面でよく使われます。
C#decimal price = 1000.25m;
decimal tax = 0.10m;
decimal total = price * (1 + tax);
注意点として、doubleとdecimalはそのまま混ぜて計算できません。
C#decimal price = 1000m;
// double rate = 0.10;
// エラーになる
// decimal total = price * rate;
decimalで計算する場合は、値にもmを付けます。
C#decimal rate = 0.10m;
decimal total = price * (1 + rate);
8-3. Math.Roundの丸め方式に注意する
Math.Roundは、既定では一般的な「0.5以上を切り上げる」丸め方とは異なる結果になる場合があります。
C#Console.WriteLine(Math.Round(2.5)); // 2
Console.WriteLine(Math.Round(3.5)); // 4
これは銀行丸めと呼ばれる方式で、ちょうど中間の値を偶数側に丸めます。
一般的な四捨五入に近い結果を期待する場合は、MidpointRounding.AwayFromZeroを指定しましょう。
C#Console.WriteLine(Math.Round(2.5, MidpointRounding.AwayFromZero)); // 3
Console.WriteLine(Math.Round(3.5, MidpointRounding.AwayFromZero)); // 4
金額計算、請求金額、ポイント計算などでは、丸め方式が仕様に直結します。必ず要件に合った丸め方式を明示しましょう。
8-4. オーバーフローや計算誤差に注意する
数値計算では、オーバーフローや計算誤差にも注意が必要です。
たとえば、intの範囲を超える計算をすると、正しく扱えない場合があります。
C#int a = int.MaxValue;
int b = 1;
// checkedを使うとオーバーフローを検出できる
checked
{
// int result = a + b;
}
また、doubleは2進数で小数を表現するため、10進数の小数を完全に表せないことがあります。
C#double result = 0.1 + 0.2;
Console.WriteLine(result); // 0.30000000000000004 のように表示されることがある
このような誤差が問題になる金額計算では、decimalを使うことを検討しましょう。
C#decimal result = 0.1m + 0.2m;
Console.WriteLine(result); // 0.3
8-5. Mathクラスでは乱数生成はできない
Mathクラスは数学的な計算を行うためのクラスですが、乱数生成は行いません。
乱数を生成したい場合は、Randomクラスを使います。
C#Random random = new Random();
int value = random.Next(1, 7);
Console.WriteLine(value); // 1〜6のいずれか
MathとRandomは役割が違います。
C#double distance = Math.Sqrt(25); // 数学計算
int dice = random.Next(1, 7); // 乱数生成
ランダムな値を作って、その値をMathで計算することはよくあります。
C#Random random = new Random();
double x = random.NextDouble() * 10;
double y = random.NextDouble() * 10;
double distance = Math.Sqrt(x * x + y * y);
9. C# Mathとよく比較される機能
C#には、Mathと似た場面で使われる機能がいくつかあります。ここでは、MathF、Random、LINQ、自作計算処理との違いを整理します。
9-1. MathとMathFの違い
Mathと似たクラスにMathFがあります。Mathは主にdoubleを扱うメソッドが中心ですが、MathFはfloat向けの数学関数を提供します。Microsoftの公式ドキュメントでも、MathFはSystem名前空間のクラスとして提供されています。
たとえば、Math.Sqrtはdoubleを返します。
C#double result = Math.Sqrt(16);
一方、MathF.Sqrtはfloatを扱います。
C#float result = MathF.Sqrt(16f);
floatはdoubleより精度は低いですが、メモリ使用量が少ないため、ゲーム開発やグラフィック処理などで使われることがあります。
一般的な業務アプリや初心者向けの学習では、まずMathを使えば十分です。floatを中心に扱う処理が多い場合に、MathFを検討するとよいでしょう。
9-2. MathとRandomの違い
Mathは数学計算を行うためのクラスです。
C#double result = Math.Sqrt(100);
一方、Randomは乱数を生成するためのクラスです。
C#Random random = new Random();
int value = random.Next(1, 100);
役割はまったく違います。
| クラス | 主な役割 |
|---|---|
Math | 数学的な計算 |
Random | 乱数の生成 |
たとえば、ランダムな位置を作って、その距離を計算する場合は、RandomとMathを組み合わせます。
C#Random random = new Random();
double x = random.Next(0, 10);
double y = random.Next(0, 10);
double distance = Math.Sqrt(x * x + y * y);
9-3. MathとLINQのMax・Minの違い
Math.MaxとMath.Minは、2つの値を比較するために使います。
C#int max = Math.Max(10, 20);
int min = Math.Min(10, 20);
一方、LINQのMaxとMinは、配列やリストなどのコレクション全体から最大値・最小値を求めるために使います。
C#using System.Linq;
int[] numbers = { 10, 20, 30 };
int max = numbers.Max();
int min = numbers.Min();
使い分けは次のように考えると簡単です。
| やりたいこと | 使う機能 |
|---|---|
| 2つの数値を比較したい | Math.Max / Math.Min |
| 配列やリストから最大値・最小値を求めたい | LINQのMax / Min |
3つ以上の値でもMath.Maxを入れ子にすれば対応できますが、値が多い場合はLINQを使ったほうが読みやすくなります。
9-4. Mathと自作計算処理の使い分け
簡単な計算であれば、自分で式を書くこともできます。
C#int square = 5 * 5;
2乗程度であれば、Math.Powを使うよりもこの書き方のほうが読みやすいこともあります。
C#double square = Math.Pow(5, 2);
一方、平方根、三角関数、対数、丸め処理などは、Mathクラスを使うほうが安全でわかりやすいです。
C#double distance = Math.Sqrt(x * x + y * y);
double angle = Math.Atan2(y, x);
double rounded = Math.Round(value, 2);
自作すべきかMathを使うべきか迷った場合は、次のように考えるとよいでしょう。
| 処理内容 | おすすめ |
|---|---|
| 単純な足し算・引き算・掛け算・割り算 | 演算子で書く |
| 2乗程度の簡単な計算 | x * xでもよい |
| 平方根・三角関数・対数 | Mathを使う |
| 丸め・切り上げ・切り捨て | Mathを使う |
| 複雑な業務ルール | 自作メソッドにまとめる |
10. C# Mathに関するよくある質問
ここでは、C#のMathクラスに関して初心者が疑問に思いやすい点をまとめます。
10-1. C#で四捨五入するにはどうすればいい?
C#で四捨五入するには、Math.Roundを使います。
C#double value = 3.6;
double result = Math.Round(value);
Console.WriteLine(result); // 4
小数点以下の桁数を指定したい場合は、第2引数に桁数を指定します。
C#double value = 3.14159;
double result = Math.Round(value, 2);
Console.WriteLine(result); // 3.14
ただし、Math.Roundは既定では銀行丸めを行います。一般的な四捨五入に近い動作にしたい場合は、MidpointRounding.AwayFromZeroを指定します。
C#double result = Math.Round(2.5, MidpointRounding.AwayFromZero);
Console.WriteLine(result); // 3
10-2. C#で平方根を求めるには?
C#で平方根を求めるには、Math.Sqrtを使います。
C#double result = Math.Sqrt(25);
Console.WriteLine(result); // 5
戻り値はdoubleです。
C#double value = Math.Sqrt(2);
Console.WriteLine(value); // 1.4142135623730951
整数として扱いたい場合はキャストできますが、小数部分が失われる点に注意してください。
C#int value = (int)Math.Sqrt(20);
Console.WriteLine(value); // 4
10-3. C#で最大値・最小値を求めるには?
2つの値から最大値を求めるにはMath.Maxを使います。
C#int max = Math.Max(10, 20);
Console.WriteLine(max); // 20
最小値を求めるにはMath.Minを使います。
C#int min = Math.Min(10, 20);
Console.WriteLine(min); // 10
配列やリストから最大値・最小値を求める場合は、LINQのMaxとMinを使います。
C#using System.Linq;
int[] numbers = { 10, 20, 30 };
Console.WriteLine(numbers.Max()); // 30
Console.WriteLine(numbers.Min()); // 10
10-4. Math.Powの戻り値はなぜdoubleなのか?
Math.Powは整数だけでなく、小数の底や指数も扱えるため、戻り値はdoubleです。
C#double result = Math.Pow(2, 3);
Console.WriteLine(result); // 8
整数の結果が欲しい場合はキャストできます。
C#int result = (int)Math.Pow(2, 3);
Console.WriteLine(result); // 8
ただし、Math.Powの結果が必ず整数になるとは限りません。
C#double result = Math.Pow(2, 0.5);
Console.WriteLine(result); // 1.4142135623730951
そのため、戻り値を安易にintへ変換すると、小数部分が失われます。整数計算なのか、小数計算なのかを意識して使いましょう。
10-5. Math.Roundで期待通りに丸められない原因は?
Math.Roundで期待通りに丸められない原因として多いのは、既定の丸め方式が銀行丸めであることです。
C#Console.WriteLine(Math.Round(2.5)); // 2
一般的な四捨五入の感覚では3を期待するかもしれませんが、既定では最も近い偶数に丸められます。
一般的な「0.5以上を切り上げる」動作に近づけたい場合は、次のように書きます。
C#Console.WriteLine(Math.Round(2.5, MidpointRounding.AwayFromZero)); // 3
また、doubleの計算誤差によって、見た目は.5に見えても内部的には少しずれた値になっている場合があります。金額計算ではdecimalを使うことも検討しましょう。
C#decimal value = 2.5m;
decimal result = Math.Round(value, 0, MidpointRounding.AwayFromZero);
Console.WriteLine(result); // 3
10-6. Mathクラスはインスタンス化できる?
Mathクラスは、通常インスタンス化して使うクラスではありません。
次のように使います。
C#double result = Math.Sqrt(16);
Math.SqrtやMath.Roundのように、クラス名から直接メソッドを呼び出します。
次のようにnew Math()として使うものではありません。
C#// Math math = new Math(); // このような使い方はしない
Mathクラスは静的メソッドをまとめたクラスとして考えると理解しやすいです。
まとめ
C#のMathクラスは、数値計算を簡潔に書くための便利なクラスです。絶対値、べき乗、平方根、最大値、最小値、四捨五入、切り上げ、切り捨て、三角関数など、よく使う数学的な処理が標準で用意されています。
基本的な使い方は、次のようにクラス名から直接メソッドを呼び出す形です。
C#Math.Sqrt(16);
Math.Pow(2, 3);
Math.Round(3.14);
Math.Max(10, 20);
Math.Min(10, 20);
特に重要なポイントは次のとおりです。
| 処理 | 使うメソッド |
|---|---|
| 絶対値 | Math.Abs |
| べき乗 | Math.Pow |
| 平方根 | Math.Sqrt |
| 最大値 | Math.Max |
| 最小値 | Math.Min |
| 四捨五入・丸め | Math.Round |
| 切り上げ | Math.Ceiling |
| 切り捨て | Math.Floor |
| 小数部分の削除 | Math.Truncate |
| 円周率 | Math.PI |
また、Math.Roundは既定では銀行丸めになるため、一般的な四捨五入を期待する場合はMidpointRounding.AwayFromZeroを指定することが大切です。
C#Math.Round(2.5, MidpointRounding.AwayFromZero);
2つの値を比較する場合はMath.MaxやMath.Min、配列やリスト全体の最大値・最小値を求める場合はLINQのMaxやMinを使い分けましょう。
Mathクラスを理解しておくと、C#での計算処理がかなり書きやすくなります。金額計算、距離計算、ゲーム開発、図形処理、データ集計など、さまざまな場面で活用できるため、まずはAbs、Round、Max、Min、Sqrt、Powあたりから使い慣れていくのがおすすめです。

