絶対値とは
「絶対値」とは、数学において、ある数値から0(ゼロ)までの距離を表す値です。そのため、絶対値は常に0(ゼロ)または正の数となり、負の数になることはありません。
5の絶対値は5です。-10の絶対値は10です。0の絶対値は0です。
C#では、この絶対値を計算するために、System.MathクラスにAbs()という静的メソッドが用意されています。
Math.Abs() メソッドの基本的な使い方
Math.Abs()メソッドは、引数として渡された数値の絶対値を返します。このメソッドは、int, long, double, decimal, floatなど、C#の主要な数値型に対応する複数の「オーバーロード」(同名で引数の型が異なるメソッド)が用意されています。
コンパイラは渡された値の型を判断し、自動的に最適なMath.Abs()メソッドを選択して実行します。
例1: int(整数)の絶対値
int型の負の数の絶対値を取得する例です。
using System;
public class AbsIntegerExample
{
public static void Main()
{
int negativeValue = -1250;
int positiveValue = 980;
// 負の数の絶対値を取得
int absoluteOfNegative = Math.Abs(negativeValue);
// 正の数の絶対値を取得 (値は変わらない)
int absoluteOfPositive = Math.Abs(positiveValue);
Console.WriteLine($"元の値 (負): {negativeValue}");
Console.WriteLine($"絶対値 (負): {absoluteOfNegative}");
Console.WriteLine($"---");
Console.WriteLine($"元の値 (正): {positiveValue}");
Console.WriteLine($"絶対値 (正): {absoluteOfPositive}");
}
}
出力結果:
元の値 (負): -1250
絶対値 (負): 1250
---
元の値 (正): 980
絶対値 (正): 980
例2: double / decimal(浮動小数点数)の絶対値
doubleやdecimalといった小数点を含む数値型でも、使い方は全く同じです。
using System;
public class AbsDecimalExample
{
public static void Main()
{
// 座標や差分計算などで負の値が発生することがある
decimal priceDifference = -450.75m;
// 差額の「大きさ」だけを知りたい場合に絶対値を使用
decimal absoluteDifference = Math.Abs(priceDifference);
Console.WriteLine($"価格差: {priceDifference:C}");
Console.WriteLine($"価格差の絶対値: {absoluteDifference:C}");
}
}
出力結果:
価格差: -¥450.75
価格差の絶対値: ¥450.75
Math.Abs() の重要な注意点: int.MinValue
Math.Abs()を使用する上で、一つだけ重大な例外ケースがあります。それは、**int.MinValue(int型が取りうる最小の負の数)**を引数に渡した場合です。
int型は、-2,147,483,648(int.MinValue)から 2,147,483,647(int.MaxValue)までの範囲の数値を格納できます。
int.MinValue(-21億…48)の絶対値は 2,147,483,648 ですが、この正の数はint.MaxValue(21億…47)よりも 1 大きいため、int型では表現できません。
このため、Math.Abs(int.MinValue) を実行すると、オーバーフローが発生し、System.OverflowExceptionという実行時エラーがスローされてプログラムが停止します。
using System;
public class AbsOverflowExample
{
public static void Main()
{
try
{
int minimumValue = int.MinValue; // -2,147,483,648
Console.WriteLine($"int.MinValue: {minimumValue}");
// この処理は OverflowException をスローする
int absoluteValue = Math.Abs(minimumValue);
Console.WriteLine(absoluteValue);
}
catch (OverflowException ex)
{
Console.WriteLine($"---");
Console.WriteLine($"エラー: {ex.GetType().Name} が発生しました。");
Console.WriteLine("int.MinValue の絶対値は int 型では表現できません。");
}
}
}
出力結果:
int.MinValue: -2147483648
---
エラー: OverflowException が発生しました。
int.MinValue の絶対値は int 型では表現できません。
この問題はlong.MinValueでも同様に発生します。外部からの入力値など、int.MinValueが入る可能性のある値をMath.Abs()で処理する場合は、try-catchで例外を捕捉するか、事前に値がint.MinValueでないかチェックするロジックが必要です。
まとめ
Math.Abs()は、C#で数値の絶対値(0からの距離)を安全かつ簡単に取得するための標準的なメソッドです。
intやdoubleなど、さまざまな数値型に対応していますが、int.MinValueやlong.MinValueといった「最小の負の値」を渡すとOverflowExceptionが発生するという例外ケースにのみ注意が必要です。
