C#で絶対値を取得する方法:Math.Abs()メソッドの正しい使い方

目次

絶対値とは

「絶対値」とは、数学において、ある数値から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(浮動小数点数)の絶対値

doubledecimalといった小数点を含む数値型でも、使い方は全く同じです。

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.MinValueint型が取りうる最小の負の数)**を引数に渡した場合です。

int型は、-2,147,483,648int.MinValue)から 2,147,483,647int.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からの距離)を安全かつ簡単に取得するための標準的なメソッドです。

intdoubleなど、さまざまな数値型に対応していますが、int.MinValuelong.MinValueといった「最小の負の値」を渡すとOverflowExceptionが発生するという例外ケースにのみ注意が必要です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次