HOWTO · Csharp
C# で decimal を int に変換する
C# で decimal を int に変換する際に、切り捨て、丸め、方向指定の丸めを選び、Int32 の範囲外の値を扱う方法を説明します。
このページの内容
C# の decimal を int に変換するには、端数を捨てるなら明示的キャスト、最も近い整数に丸めるなら Convert.ToInt32 を使います。常に下、上、または特定の中間値規則が必要なら、先に丸めてからキャストします。値が Int32 に収まらなければ、どの変換でも OverflowException が発生します。
これは表示ではなく業務規則です。-12.9m は切り捨てで -12、Math.Floor では -13 です。金額や測定値の端数が重要なら decimal のまま保持します。
decimal をゼロ方向に切り捨てる
(int)value は切り捨ての意図を明確に示します。decimal リテラルには m が必要で、ない場合の 12.9 は double です。整数変換はゼロ方向であり、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.5m は 12、13.5m は 14 です。
アプリケーションの規則が偶数丸めの場合だけ Convert.ToInt32 を選びます。 decimal overload も範囲外では OverflowException を指定します。
明示的な丸め規則を選ぶ
方向付き丸めでは、先に decimal に Math を適用します。Math.Floor は負の無限大、Math.Ceiling は正の無限大へ進むため、Math.Floor(-12.9m) は -13m、(int)-12.9m は -12 です。
別の中間値規則はコードに書きます。Math.Round(value, MidpointRounding.AwayFromZero) は 2.5m を 3m、-2.5m を -3m にします。既定の Math.Round(decimal) は偶数丸めです。 Math.Truncate もゼロ方向の decimal を得る選択肢です。
先にキャストしてはいけません。(int)value は既に端数を失っています。丸め、範囲を確認してからキャストします。
int 範囲外の値を扱う
int は int.MinValue から int.MaxValue までの32ビット符号付き整数です。decimal ははるかに大きい値を表せます。範囲外の直接変換は OverflowException であり、値を端点に制限しません。
範囲外の入力が予想されるなら事前に検証するか、アプリケーション境界で OverflowException を捕捉します。API に合わせるために金額を黙ってキャストせず、より広い整数型または許される decimal を選びます。
規則に合う変換を選ぶ
| 意図した結果 | 使用方法 | 重要な動作 |
|---|---|---|
| 端数を捨てる | (int)value |
ゼロ方向に切り捨てる。 |
最も近い int |
Convert.ToInt32(value) |
中間値は偶数へ丸める。 |
| 常に下または上 | Math.Floor または Math.Ceiling の後にキャスト |
負数では切り捨てと異なる。 |
| 独自の中間値規則 | MidpointRounding 付き Math.Round の後にキャスト |
規則を明記する。 |
通常の切り捨てには明示的キャストが簡潔です。意図した丸め規則の場合だけ Convert.ToInt32 や Math を使い、int の境界では必ず OverflowException を考慮します。