C#で絶対値を取得する方法|Math.Absの使い方と型別サンプルを初心者向けに解説
はじめに
C#で数値の絶対値を取得したい場合は、Math.Absメソッドを使用します。
絶対値は、数値からプラスやマイナスの符号を取り除いた値です。たとえば、-10の絶対値は10、10の絶対値も10になります。
int result = Math.Abs(-10);Console.WriteLine(result); // 10
Math.Absは整数だけでなく、float、double、decimalなどの小数にも使用できます。ただし、整数型の最小値を渡した場合や、null許容型を扱う場合には注意が必要です。
この記事では、C#で絶対値を取得する基本的な方法から、型別のサンプル、例外が発生するケース、実践的な活用例まで初心者向けに解説します。
1. C#で絶対値を取得する基本
1-1. 絶対値とは何か
絶対値とは、数値が0からどれだけ離れているかを表す値です。数値の符号は考慮しないため、絶対値がマイナスになることはありません。
代表的な数値の絶対値は、次のとおりです。
| 元の値 | 絶対値 |
|---|---|
-100 | 100 |
-5 | 5 |
0 | 0 |
5 | 5 |
100 | 100 |
負の数は正の数に変換されますが、正の数と0はそのまま返されます。
絶対値は、2つの数値の差、座標間の距離、測定値の誤差などを求める場面でよく使用されます。
1-2. C#ではMath.Absメソッドを使う
C#で絶対値を取得するには、MathクラスのAbsメソッドを使用します。
基本構文は次のとおりです。
Math.Abs(数値)たとえば、-20の絶対値を取得するコードは次のようになります。
int result = Math.Abs(-20);Console.WriteLine(result); // 20
Absは「absolute value」の略です。
Math.Absには、引数の型に応じた複数のオーバーロードが用意されています。そのため、整数や小数に対して同じような書き方で使用できます。
int intValue = Math.Abs(-10);double doubleValue = Math.Abs(-10.5);decimal decimalValue = Math.Abs(-10.5m);1-3. Math.Absを使うために必要な名前空間
Mathクラスは、System名前空間に定義されています。
通常は、ソースコードの先頭に次の記述を追加します。
using System;完全なサンプルは次のとおりです。
using System;class Program{static void Main(){int result = Math.Abs(-10);Console.WriteLine(result);}}
using System;を記述しない場合は、完全修飾名のSystem.Math.Absを使用できます。
int result = System.Math.Abs(-10);新しい.NETプロジェクトでは暗黙的なusingが有効になっており、using System;を書かなくても使用できる場合があります。ただし、プロジェクトの設定によって異なるため、Mathが見つからない場合はusing System;を確認してください。
2. Math.Absの基本的な使い方
2-1. int型の絶対値を取得するサンプル
int型の絶対値を取得する基本的なコードは次のとおりです。
int number = -25;int absoluteValue = Math.Abs(number);Console.WriteLine(absoluteValue); // 25
Math.Abs(number)の戻り値を、int型の変数absoluteValueに代入しています。
メソッドの呼び出し結果を、そのまま表示することもできます。
Console.WriteLine(Math.Abs(-25)); // 25ただし、実際のプログラムでは、戻り値を変数に入れてから使用したほうが処理の意味を理解しやすくなることがあります。
2-2. 負の数・正の数・0を渡した場合の戻り値
Math.Absに負の数を渡すと、正の数に変換されます。
Console.WriteLine(Math.Abs(-10)); // 10正の数を渡した場合は、値がそのまま返されます。
Console.WriteLine(Math.Abs(10)); // 100を渡した場合も、戻り値は0です。
Console.WriteLine(Math.Abs(0)); // 0まとめると、次のようになります。
int negative = Math.Abs(-10);int positive = Math.Abs(10);int zero = Math.Abs(0);Console.WriteLine(negative); // 10Console.WriteLine(positive); // 10Console.WriteLine(zero); // 0
入力値が負か正かを事前に判定する必要はありません。Math.Absにそのまま渡せば、常に符号を取り除いた値を取得できます。
2-3. 変数に入った値の絶対値を取得する方法
実際のプログラムでは、固定値ではなく、変数に入っている値の絶対値を求めるケースが一般的です。
int number = -42;int result = Math.Abs(number);Console.WriteLine(result); // 42
ユーザーが入力した値の絶対値を取得することもできます。
using System;class Program{static void Main(){Console.Write("整数を入力してください: ");string? input = Console.ReadLine();
if (int.TryParse(input, out int number)){int result = Math.Abs(number);Console.WriteLine($"絶対値は{result}です。");}else{Console.WriteLine("整数として読み取れませんでした。");}}
}
ただし、ユーザーがint.MinValueを入力すると、Math.AbsでOverflowExceptionが発生します。安全性を高める方法については後述します。
3. 型別に見るMath.Absのサンプル
3-1. int型で絶対値を取得する
intは、C#で一般的に使用される32ビット符号付き整数型です。
int number = -100;int result = Math.Abs(number);Console.WriteLine(result); // 100
int型の値を渡した場合、戻り値もint型です。
int result = Math.Abs(-100);intで表現できる範囲は、-2,147,483,648から2,147,483,647までです。
最小値であるint.MinValueだけは、同じint型で正の値に変換できません。
Console.WriteLine(int.MinValue); // -2147483648Console.WriteLine(int.MaxValue); // 2147483647そのため、Math.Abs(int.MinValue)は例外になります。
3-2. long型で絶対値を取得する
longは、64ビット符号付き整数型です。intより大きな整数を扱う場合に使用します。
long number = -5_000_000_000L;long result = Math.Abs(number);Console.WriteLine(result); // 5000000000
long型のリテラルであることを明示する場合は、末尾にLを付けます。
long result = Math.Abs(-5_000_000_000L);long型の値を渡した場合、戻り値もlong型です。
ただし、long.MinValueを渡すとOverflowExceptionが発生するため注意してください。
3-3. float型で絶対値を取得する
floatは、32ビットの単精度浮動小数点型です。
float number = -12.5f;float result = Math.Abs(number);Console.WriteLine(result); // 12.5
float型のリテラルには、末尾にfまたはFを付けます。
float result = Math.Abs(-3.14f);floatを渡した場合、戻り値もfloatです。
なお、float.NaNを渡した場合はfloat.NaNが返され、負の無限大を渡した場合は正の無限大が返されます。
Console.WriteLine(Math.Abs(float.NaN)); // NaNConsole.WriteLine(Math.Abs(float.NegativeInfinity)); // Infinity3-4. double型で絶対値を取得する
doubleは、64ビットの倍精度浮動小数点型です。C#で小数リテラルを記述すると、通常はdoubleとして扱われます。
double number = -123.456;double result = Math.Abs(number);Console.WriteLine(result); // 123.456
double型の値を渡した場合、戻り値もdouble型です。
double result = Math.Abs(-9.8);doubleは科学計算、座標、測定値、統計処理など、一般的な小数計算に向いています。ただし、2進数で小数を表現する仕組み上、一部の10進小数を正確に保持できない点には注意が必要です。
double value = 0.1 + 0.2;Console.WriteLine(value); // 環境や表示形式によって0.30000000000000004など3-5. decimal型で絶対値を取得する
decimalは、金額などの10進小数を高い精度で扱うための型です。
decimal priceDifference = -1250.75m;decimal result = Math.Abs(priceDifference);Console.WriteLine(result); // 1250.75
decimal型のリテラルには、末尾にmまたはMを付けます。
decimal result = Math.Abs(-99.99m);decimalを渡した場合、戻り値もdecimalです。
金額の差額を正の値で表示したい場合は、次のように使用できます。
decimal expectedPrice = 10_000m;decimal actualPrice = 9_500m;decimal difference = Math.Abs(expectedPrice - actualPrice);
Console.WriteLine(difference); // 500
3-6. short型・sbyte型で絶対値を取得する
Math.Absは、short型やsbyte型にも対応しています。
short型の例は次のとおりです。
short number = -300;short result = Math.Abs(number);Console.WriteLine(result); // 300
sbyte型の例は次のとおりです。
sbyte number = -100;sbyte result = Math.Abs(number);Console.WriteLine(result); // 100
ただし、それぞれの最小値を渡すと例外が発生します。
short shortValue = short.MinValue;sbyte sbyteValue = sbyte.MinValue;// Math.Abs(shortValue); // OverflowException// Math.Abs(sbyteValue); // OverflowException
これは、最小値の絶対値を同じ型で表現できないためです。
なお、byte、ushort、uint、ulongなどの符号なし整数型は、もともと負の値を持ちません。そのため、通常は絶対値を取得する必要がありません。
4. Math.Absの戻り値と型の違い
4-1. 渡した型によって戻り値の型も変わる
Math.Absには複数のオーバーロードがあり、基本的には渡した値と同じ型の値が返されます。
int intResult = Math.Abs(-10);long longResult = Math.Abs(-10L);float floatResult = Math.Abs(-10.5f);double doubleResult = Math.Abs(-10.5);decimal decimalResult = Math.Abs(-10.5m);主な対応関係は次のとおりです。
| 引数の型 | 戻り値の型 |
sbyte | sbyte |
short | short |
int | int |
long | long |
float | float |
double | double |
decimal | decimal |
リテラルの書き方によって、選択されるオーバーロードが変わります。
Math.Abs(-10); // intMath.Abs(-10L); // longMath.Abs(-10.5f); // floatMath.Abs(-10.5); // doubleMath.Abs(-10.5m); // decimal戻り値を変数に代入するときは、型を合わせる必要があります。
4-2. int・long・double・decimalの使い分け
どの型を使用するかは、扱う数値の種類や範囲によって決めます。
intは、一般的な整数に向いています。
int quantity = Math.Abs(-20);longは、intの範囲を超える大きな整数に向いています。
long populationDifference = Math.Abs(-5_000_000_000L);doubleは、座標、距離、計測値などの小数計算に向いています。
double distance = Math.Abs(-12.345);decimalは、金額や会計処理など、10進小数の精度を重視する計算に向いています。
decimal priceDifference = Math.Abs(-1250.50m);単に絶対値を取得する部分だけではなく、その前後でどのような計算をするかも考えて型を選択しましょう。
4-3. 金額計算ではdecimal型を使うべき理由
金額計算では、一般的にdoubleよりもdecimalが適しています。
doubleやfloatは2進浮動小数点数であるため、0.1や0.01などの10進小数を内部で正確に表現できないことがあります。
一方、decimalは10進数を基準として値を保持するため、金額計算で意図しない端数が発生しにくくなります。
decimal listedPrice = 1000.10m;decimal paidPrice = 999.90m;decimal difference = Math.Abs(listedPrice - paidPrice);
Console.WriteLine(difference); // 0.20
ただし、decimalを使えば丸め処理が不要になるわけではありません。税金、割引、通貨換算などを扱う場合は、業務上のルールに従ってMath.Roundなどによる丸め処理を明示する必要があります。
5. Math.Absを使うときの注意点
5-1. int.MinValueで例外が発生するケース
int.MinValueに対してMath.Absを使用すると、OverflowExceptionが発生します。
int value = int.MinValue;int result = Math.Abs(value); // OverflowExceptionint型の範囲は次のとおりです。
最小値: -2,147,483,648最大値: 2,147,483,647-2,147,483,648の絶対値は2,147,483,648ですが、この値はint.MaxValueを超えています。そのため、int型では結果を表現できません。
int型のすべての値を安全に絶対値へ変換したい場合は、先にlong型へ変換します。
int value = int.MinValue;long result = Math.Abs((long)value);Console.WriteLine(result); // 2147483648
キャストは、Math.Absを呼び出す前に行うことが重要です。
long correct = Math.Abs((long)value);次の書き方では、先にint版のMath.Absが呼ばれるため、例外を防げません。
// long incorrect = (long)Math.Abs(value);5-2. long.MinValueで例外が発生するケース
long.MinValueでも同様に、OverflowExceptionが発生します。
long value = long.MinValue;long result = Math.Abs(value); // OverflowExceptionlong.MinValueの絶対値はlong.MaxValueより1大きいため、long型では表現できません。
long型の全範囲を扱う必要がある場合は、decimalやBigIntegerなど、より広い範囲を表現できる型へ変換します。
decimalを使用する例は次のとおりです。
long value = long.MinValue;decimal result = Math.Abs((decimal)value);Console.WriteLine(result); // 9223372036854775808
BigIntegerを使用する場合は、System.Numerics名前空間を読み込みます。
using System.Numerics;long value = long.MinValue;BigInteger result = BigInteger.Abs(new BigInteger(value));
Console.WriteLine(result); // 9223372036854775808
5-3. null許容型にはそのまま使えない
int?などのnull許容型を、そのままMath.Absへ渡すことはできません。
int? number = -10;// int? result = Math.Abs(number); // コンパイルエラー
nullでない場合だけ絶対値を取得するには、HasValueとValueを使用します。
int? number = -10;int? result = number.HasValue? Math.Abs(number.Value): null;
Console.WriteLine(result); // 10
パターンマッチングを使用すると、次のようにも書けます。
int? number = -10;int? result = number is int value? Math.Abs(value): null;
nullを0として扱ってよい場合は、null合体演算子を使用できます。
int? number = null;int result = Math.Abs(number ?? 0);Console.WriteLine(result); // 0
ただし、nullと0を区別する必要がある処理では、nullをそのまま保持する方法を選びましょう。
5-4. オーバーフローを防ぐ考え方
絶対値を取得する前の計算で、すでにオーバーフローが発生することもあります。
たとえば、次のコードでは、Math.Absを呼び出す前にa - bがint型として計算されます。
int a = int.MaxValue;int b = int.MinValue;long difference = Math.Abs(a - b);
a - bの正しい結果はint型の範囲を超えるため、この書き方では安全に計算できません。
計算前にlongへ変換します。
int a = int.MaxValue;int b = int.MinValue;long difference = Math.Abs((long)a - b);
Console.WriteLine(difference); // 4294967295
重要なのは、計算が終わってから変換するのではなく、計算前に広い型へ変換することです。
オーバーフローを検出したい場合は、checkedを利用できます。
try{int a = int.MaxValue;int b = -1;int result = checked(a - b);
}catch (OverflowException){Console.WriteLine("計算結果がint型の範囲を超えました。");}
入力値の範囲が分からない場合は、次の点を確認しましょう。
最小値が渡される可能性があるか
引き算などの途中計算が型の範囲を超えないか
intよりlongやdecimalが適切ではないか範囲が非常に大きい場合に
BigIntegerが必要ではないか
6. よくあるエラーと対処法
6-1. 「Mathが見つからない」と表示される場合
Mathが見つからないというエラーが表示された場合は、System名前空間が読み込まれているか確認します。
using System;次のように完全修飾名を使用する方法もあります。
int result = System.Math.Abs(-10);また、自分でMathという名前のクラスや変数を定義していると、System.Mathと名前が衝突することがあります。
class Math{}このような場合も、System.Math.Absと完全修飾名で記述することで、標準ライブラリのMathクラスを明示できます。
6-2. 型が合わずにコンパイルエラーになる場合
Math.Absの戻り値を異なる型の変数へ代入すると、コンパイルエラーになることがあります。
double value = -12.5;// int result = Math.Abs(value); // コンパイルエラー
Math.Abs(value)の戻り値はdoubleなので、double型で受け取る必要があります。
double result = Math.Abs(value);整数へ変換したい場合は、変換方法を明示します。
double value = -12.5;int result = (int)Math.Abs(value);Console.WriteLine(result); // 12
キャストでは小数部分が切り捨てられます。四捨五入したい場合は、先にMath.Roundを使用します。
double value = -12.5;int result = checked((int)Math.Round(Math.Abs(value)));Console.WriteLine(result);
切り捨て、切り上げ、四捨五入のどれが必要なのかを決めてから変換してください。
6-3. nullの値を扱う場合の対処法
null許容型を扱う場合は、nullのときにどのような結果にするかを決める必要があります。
nullをそのまま返す場合は、次のように記述できます。
double? value = -3.5;double? result = value.HasValue? Math.Abs(value.Value): null;
nullを0として扱う場合は、null合体演算子を使用できます。
double? value = null;double result = Math.Abs(value ?? 0.0);Console.WriteLine(result); // 0
nullの場合に処理を中止する方法もあります。
double? value = null;if (value is null){Console.WriteLine("値が入力されていません。");return;}
double result = Math.Abs(value.Value);
nullを0へ置き換えると、「値がない状態」と「数値の0」を区別できなくなります。データの意味に合わせて処理方法を選択しましょう。
6-4. 想定と違う型で計算される場合の対処法
数値リテラルは、書き方によって型が変わります。
Math.Abs(-10); // intMath.Abs(-10L); // longMath.Abs(-10.5); // doubleMath.Abs(-10.5f); // floatMath.Abs(-10.5m); // decimalたとえば、decimal型として計算したい場合は、リテラルにmを付ける必要があります。
decimal result = Math.Abs(-10.5m);変数同士の計算でも、型によって結果が変わります。
int a = 5;int b = 2;double result = Math.Abs(a / b);
Console.WriteLine(result); // 2
a / bは整数同士の除算なので、小数部分が切り捨てられています。
小数として計算するには、計算前に型を変換します。
int a = 5;int b = 2;double result = Math.Abs((double)a / b);
Console.WriteLine(result); // 2.5
Math.Absが値を変換したのではなく、Math.Absへ渡す前の計算で型が決まっている点に注意してください。
7. 実践で使える絶対値の活用例
7-1. 2つの数値の差を正の値で取得する
2つの値の差を常に正の値で取得したい場合は、引き算の結果をMath.Absへ渡します。
int value1 = 80;int value2 = 120;int difference = Math.Abs(value1 - value2);
Console.WriteLine(difference); // 40
引き算の順番を入れ替えても、絶対値は同じです。
Console.WriteLine(Math.Abs(80 - 120)); // 40Console.WriteLine(Math.Abs(120 - 80)); // 40大きな整数を扱う場合は、引き算の前にlongへ変換すると安全です。
int value1 = int.MaxValue;int value2 = int.MinValue;long difference = Math.Abs((long)value1 - value2);
Console.WriteLine(difference); // 4294967295
7-2. 距離や誤差の計算に使う
1次元上にある2点の距離は、座標の差の絶対値で求められます。
double pointA = -3.5;double pointB = 7.2;double distance = Math.Abs(pointA - pointB);
Console.WriteLine(distance); // 10.7
測定値と基準値の誤差を求める場合にも使用できます。
double expected = 100.0;double actual = 98.7;double error = Math.Abs(expected - actual);
Console.WriteLine(error); // 約1.3
誤差が許容範囲内か判定する例は次のとおりです。
double expected = 100.0;double actual = 99.8;double tolerance = 0.5;bool isWithinTolerance =Math.Abs(expected - actual) <= tolerance;
Console.WriteLine(isWithinTolerance); // True
浮動小数点数は計算誤差を含むことがあるため、doubleやfloatを完全一致で比較するのではなく、許容誤差を使って比較する方法がよく用いられます。
7-3. 配列やリスト内の数値を絶対値に変換する
配列内のすべての数値を絶対値に変換するには、for文を使用できます。
int[] numbers = { -10, 5, -3, 0, 8 };for (int i = 0; i < numbers.Length; i++){numbers[i] = Math.Abs(numbers[i]);}
Console.WriteLine(string.Join(", ", numbers));// 10, 5, 3, 0, 8
元の配列を変更せず、新しい配列を作成したい場合はLINQのSelectを利用できます。
using System;using System.Linq;int[] numbers = { -10, 5, -3, 0, 8 };
int[] absoluteNumbers = numbers.Select(number => Math.Abs(number)).ToArray();
Console.WriteLine(string.Join(", ", absoluteNumbers));// 10, 5, 3, 0, 8
List<int>でも同様に処理できます。
using System;using System.Collections.Generic;using System.Linq;List<int> numbers = new() { -4, 7, -12, 0 };
List<int> absoluteNumbers = numbers.Select(number => Math.Abs(number)).ToList();
配列やリストにint.MinValueが含まれる可能性がある場合は、longへ変換してから絶対値を取得します。
long[] absoluteNumbers = numbers.Select(number => Math.Abs((long)number)).ToArray();7-4. 条件分岐で絶対値を使う
2つの値の差が一定範囲内かどうかを判定する場合にも、Math.Absが役立ちます。
int target = 100;int current = 96;if (Math.Abs(target - current) <= 5){Console.WriteLine("目標値に近いです。");}else{Console.WriteLine("目標値から離れています。");}
前回の値と今回の値が大きく変化したかを判定する例は次のとおりです。
double previousValue = 50.0;double currentValue = 62.5;double change = Math.Abs(currentValue - previousValue);
if (change >= 10.0){Console.WriteLine("大きな変化がありました。");}
絶対値を使うことで、増加か減少かに関係なく、変化量の大きさだけを比較できます。
8. Math.Abs以外の書き方との違い
8-1. 三項演算子で絶対値を求める方法
三項演算子を使って、値が負の場合だけ符号を反転することでも絶対値を求められます。
int value = -10;int result = value < 0? -value: value;
Console.WriteLine(result); // 10
処理の意味は次のとおりです。
valueが0未満なら-valueを返すそれ以外ならvalueを返すただし、int.MinValueでは問題が発生します。
int value = int.MinValue;int result = value < 0 ? -value : value;通常の未チェックコンテキストでは、符号を反転しても正しい絶対値にならず、負の値のままになる可能性があります。checked内ではOverflowExceptionが発生します。
安全に処理するには、先にlongへ変換します。
int value = int.MinValue;long result = value < 0? -(long)value: value;
Console.WriteLine(result); // 2147483648
8-2. if文で絶対値を求める方法
if文を使用して絶対値を求めることもできます。
int value = -10;int result;if (value < 0){result = -value;}else{result = value;}
Console.WriteLine(result); // 10
処理を細かく分けて書けるため、初学者にも流れが分かりやすい書き方です。
ただし、三項演算子と同じく、整数型の最小値を正しく処理できない問題があります。
int value = int.MinValue;long result;if (value < 0){result = -(long)value;}else{result = value;}
単純に絶対値を取得するだけなら、if文よりもMath.Absのほうが短く、意図も明確です。
8-3. 基本的にはMath.Absを使うべき理由
C#で絶対値を取得するときは、基本的にMath.Absを使用するのがおすすめです。
int result = Math.Abs(value);三項演算子やif文と比べて、次の利点があります。
コードが短い
絶対値を取得する処理だとすぐに分かる
整数や小数など複数の型に対応している
整数型の最小値では例外が発生し、処理できない値を検出できる
手作業による条件分岐のミスを減らせる
一方、Math.Absを使用しても、最小値や途中計算のオーバーフローを自動的に解決できるわけではありません。
入力範囲に不安がある場合は、事前に広い型へ変換します。
int value = int.MinValue;long result = Math.Abs((long)value);9. C#の絶対値に関するよくある質問
9-1. Math.Absは小数にも使える?
Math.Absは整数だけでなく、float、double、decimalなどの小数にも使用できます。
float floatValue = Math.Abs(-3.5f);double doubleValue = Math.Abs(-3.5);decimal decimalValue = Math.Abs(-3.5m);それぞれ、渡した値と同じ型の結果が返されます。
一般的な小数計算にはdouble、金額計算にはdecimalがよく使用されます。
9-2. 負の値だけを正にしたい場合もMath.Absでよい?
負の値を正の値にし、正の値と0はそのままにしたい場合も、Math.Absで問題ありません。
Console.WriteLine(Math.Abs(-10)); // 10Console.WriteLine(Math.Abs(10)); // 10Console.WriteLine(Math.Abs(0)); // 0「負の値だけを変換する」という条件分岐を自分で書く必要はありません。
ただし、元の値が負だったかどうかも必要な場合は、絶対値を取得する前に判定します。
int value = -10;bool wasNegative = value < 0;int absoluteValue = Math.Abs(value);Console.WriteLine(wasNegative); // TrueConsole.WriteLine(absoluteValue); // 10
9-3. 絶対値を整数に変換したい場合はどうする?
元の値が整数型なら、Math.Absの戻り値も整数型です。
int result = Math.Abs(-10);元の値がdoubleなどの小数型の場合は、絶対値を取得した後に整数へ変換します。
double value = -12.8;int result = (int)Math.Abs(value);Console.WriteLine(result); // 12
キャストでは小数部分が切り捨てられます。
四捨五入する場合はMath.Round、切り捨てを明示する場合はMath.Floor、切り上げる場合はMath.Ceilingを組み合わせます。
double value = -12.8;int rounded = checked((int)Math.Round(Math.Abs(value)));int floored = checked((int)Math.Floor(Math.Abs(value)));int ceiling = checked((int)Math.Ceiling(Math.Abs(value)));
Console.WriteLine(rounded); // 13Console.WriteLine(floored); // 12Console.WriteLine(ceiling); // 13
大きな小数を整数へ変換すると、整数型の範囲を超える可能性があります。必要に応じてcheckedを使用し、OverflowExceptionを検出してください。
9-4. UnityでもMath.Absは使える?
Unityでも、System.Math.Absを使用できます。
using System;using UnityEngine;public class Sample : MonoBehaviour{void Start(){int value = -10;int result = Math.Abs(value);
Debug.Log(result); // 10}
}
System.Mathと明示して書くこともできます。
int result = System.Math.Abs(-10);Unityでは、ゲーム開発向けの数値計算を提供するMathfクラスもよく使用されます。
float value = -3.5f;float result = Mathf.Abs(value);Debug.Log(result); // 3.5
floatを中心としたUnityのゲーム処理ではMathf.Absが便利です。一方、doubleやdecimalなどを扱う場合は、System.Math.Absを使用します。
まとめ
C#で絶対値を取得するには、Math.Absメソッドを使用します。
int result = Math.Abs(-10);Console.WriteLine(result); // 10
Math.Absは、intやlongなどの整数型だけでなく、float、double、decimalなどの小数型にも対応しています。基本的には、渡した値と同じ型の結果が返されます。
int intValue = Math.Abs(-10);long longValue = Math.Abs(-10L);float floatValue = Math.Abs(-10.5f);double doubleValue = Math.Abs(-10.5);decimal decimalValue = Math.Abs(-10.5m);使用時に特に注意したいのは、整数型の最小値です。
Math.Abs(int.MinValue); // OverflowExceptionMath.Abs(long.MinValue); // OverflowExceptionint.MinValueを安全に処理する場合は、Math.Absを呼び出す前にlongへ変換します。
long result = Math.Abs((long)int.MinValue);また、2つの整数の差を求める場合は、引き算そのものがオーバーフローしないように、計算前に広い型へ変換することが重要です。
long difference = Math.Abs((long)value1 - value2);null許容型はそのまま渡せないため、nullチェックやnull合体演算子を使用します。
int? result = number.HasValue? Math.Abs(number.Value): null;三項演算子やif文でも絶対値は求められますが、コードの分かりやすさや型ごとの対応を考えると、通常はMath.Absを使うのが適切です。

