HOWTO · Csharp

C# で decimal を int に変換する

C# で decimal を int に変換する際に、切り捨て、丸め、方向指定の丸めを選び、Int32 の範囲外の値を扱う方法を説明します。

このページの内容

C# の decimalint に変換するには、端数を捨てるなら明示的キャスト、最も近い整数に丸めるなら Convert.ToInt32 を使います。常に下、上、または特定の中間値規則が必要なら、先に丸めてからキャストします。値が Int32 に収まらなければ、どの変換でも OverflowException が発生します。

これは表示ではなく業務規則です。-12.9m は切り捨てで -12Math.Floor では -13 です。金額や測定値の端数が重要なら decimal のまま保持します。

decimal をゼロ方向に切り捨てる

(int)value は切り捨ての意図を明確に示します。decimal リテラルには m が必要で、ない場合の 12.9double です。整数変換はゼロ方向であり、floor や ceiling ではありません。 C# numeric conversions を参照してください。

using System;

decimal positive = 12.9m;
decimal negative = -12.9m;
Console.WriteLine($"cast: {(int)positive}, {(int)negative}");
Console.WriteLine($"round: {Convert.ToInt32(12.5m)}, {Convert.ToInt32(13.5m)}");
try
{
    decimal tooLarge = decimal.MaxValue;
    Console.WriteLine(checked((int)tooLarge));
}
catch (OverflowException)
{
    Console.WriteLine("overflow");
}
cast: 12, -12
round: 12, 14
overflow

出力の1行目は端数を捨て、負数をゼロへ近づけることを示します。最後は境界例です。checked でオーバーフローを明示し、catch で停止せず報告します。

最も近い整数に丸める

Convert.ToInt32(decimal) は切り捨てではありません。最も近い32ビット符号付き整数へ丸め、ちょうど .5 では偶数丸めです。検証済みの例では 12.5m1213.5m14 です。

アプリケーションの規則が偶数丸めの場合だけ Convert.ToInt32 を選びます。 decimal overload も範囲外では OverflowException を指定します。

明示的な丸め規則を選ぶ

方向付き丸めでは、先に decimalMath を適用します。Math.Floor は負の無限大、Math.Ceiling は正の無限大へ進むため、Math.Floor(-12.9m)-13m(int)-12.9m-12 です。

別の中間値規則はコードに書きます。Math.Round(value, MidpointRounding.AwayFromZero)2.5m3m-2.5m-3m にします。既定の Math.Round(decimal) は偶数丸めです。 Math.Truncate もゼロ方向の decimal を得る選択肢です。

先にキャストしてはいけません。(int)value は既に端数を失っています。丸め、範囲を確認してからキャストします。

int 範囲外の値を扱う

intint.MinValue から int.MaxValue までの32ビット符号付き整数です。decimal ははるかに大きい値を表せます。範囲外の直接変換は OverflowException であり、値を端点に制限しません。

範囲外の入力が予想されるなら事前に検証するか、アプリケーション境界で OverflowException を捕捉します。API に合わせるために金額を黙ってキャストせず、より広い整数型または許される decimal を選びます。

規則に合う変換を選ぶ

意図した結果 使用方法 重要な動作
端数を捨てる (int)value ゼロ方向に切り捨てる。
最も近い int Convert.ToInt32(value) 中間値は偶数へ丸める。
常に下または上 Math.Floor または Math.Ceiling の後にキャスト 負数では切り捨てと異なる。
独自の中間値規則 MidpointRounding 付き Math.Round の後にキャスト 規則を明記する。

通常の切り捨てには明示的キャストが簡潔です。意図した丸め規則の場合だけ Convert.ToInt32Math を使い、int の境界では必ず OverflowException を考慮します。