248

10 進数を int に変換するにはどうすればよいですか?

4

13 に答える 13

296

Convert.ToInt32次のmscorlibように使用

decimal value = 3.14m;
int n = Convert.ToInt32(value);

MSDNを参照してください。も使用できますDecimal.ToInt32。繰り返しますが、MSDNを参照してください。最後に、次のように直接キャストを行うことができます

decimal value = 3.14m;
int n = (int) value;

明示的なキャスト演算子を使用します。MSDNを参照してください。

于 2009-02-01T16:31:37.193 に答える
68

できません。

もちろん、可能です、int (System.Int32) は、考えられるすべての 10 進数値を保持するには十分な大きさではありません。

つまり、int.MaxValue より大きい 10 進数をキャストするとオーバーフローし、10 進数が int.MinValue より小さい場合はアンダーフローします。

アンダーフロー/オーバーフローするとどうなりますか? 2 つのことのうちの 1 つ。ビルドがチェックされていない場合 (つまり、チェックされていても CLR は気にしない場合)、アプリケーションは値のオーバー/アンダーフロー後も続行しますが、int の値は期待どおりになりません。これにより、断続的なバグが発生する可能性があり、修正が難しい場合があります。アプリケーションが不明な状態になり、アプリケーションが処理している重要なデータが破損する可能性があります。良くない。

アセンブリがチェックされている場合 ([プロパティ] -> [ビルド] -> [詳細] -> [算術オーバーフロー/アンダーフローのチェック] または /checked コンパイラ オプション)、コードはアンダーフローまたはオーバーフローが発生したときに例外をスローします。これはおそらくないよりはましです。ただし、アセンブリのデフォルトでは、オーバー/アンダーフローはチェックされません。

本当の質問は、「何をしようとしているのか」です。要件を知らなければ、この場合に 何をすべきかを誰も教えてくれません。

特に気にしない場合は、ここでの回答が有効です。ただし、オーバーフローが発生する可能性があり、キャスト コードをチェックされていないブロックにラップすることで問題にならないという理解を伝える必要があります。

unchecked
{
  // do your conversions that may underflow/overflow here
}

そうすれば、あなたの背後にいる人々は、あなたが気にしないことを理解し、将来誰かがあなたのビルドを /checked に変更したとしても、コードが予期せず壊れることはありません。

数値の小数部分を削除して整数部分を残したいだけの場合は、Math.Truncate を使用できます

decimal actual = 10.5M;
decimal expected = 10M;
Assert.AreEqual(expected, Math.Truncate(actual));
于 2009-02-01T17:10:24.090 に答える
48
int i = (int)d;

端数を切り捨てて表示します。

最も近い偶数に丸めたい場合 (つまり、>.5 は切り上げます)、次を使用できます。

int i = (int)Math.Round(d, MidpointRounding.ToEven);

一般に、C# ではすべての数値型の間でキャストできます。キャスト中に失われる情報がない場合は、暗黙的に行うことができます。

int i = 10;
decimal d = i;

ただし、必要に応じて明示的に行うこともできます。

int i = 10;
decimal d = (decimal)i;

ただし、キャストによって情報が失われる場合は、明示的に行う必要があります (情報が失われる可能性があることを示すため)。

decimal d = 10.5M;
int i = (int)d;

ここでは、「.5」を失っています。これは問題ないかもしれませんが、それについて明示し、明示的なキャストを行って、情報が失われる可能性があることを示す必要があります。

于 2009-02-01T16:41:44.100 に答える
25
decimal d = 2;
int i = (int) d;

これで問題なく動作するはずです。

于 2009-02-01T16:32:55.177 に答える
8

System.DecimalメンバーIConvertableを持つインターフェイスを実装します。ToInt32()

電話System.Decimal.ToInt32()はあなたのために働いていますか?

于 2009-02-01T16:32:11.123 に答える
8

小数を最も近い整数に丸める

decimal a ;
int b = (int)(a + 0.5m);

いつa = 49.9、そしてb = 50

いつa = 49.5、そしてb = 50

いつa = 49.4、その後b = 49など

于 2011-09-05T13:13:36.730 に答える
7

10進数d = 5.5;

int i = decimal.ToInt32(d);// you will get i = 5

ref:リンクテキスト

于 2009-08-31T02:56:05.530 に答える
7

素早い丸めの巧妙な方法は、小数を int にキャストする前に .5 を追加することです。

decimal d = 10.1m;
d += .5m;
int i = (int)d;

まだ葉i=10、しかし

decimal d = 10.5m;
d += .5m;
int i = (int)d;

のように切り上げi=11ます。

于 2009-02-01T17:06:01.710 に答える
7

Math.RoundMath.FloorMath.CeilingまたはMath.Truncateを使用して、丸めモードを適切に明示的に設定することを好みます。

これらはすべて Decimal も返すことに注意してください。Decimal は Int32 よりも値の範囲が広いため、キャスト (およびオーバーフロー/アンダーフローのチェック) が必要になります。

 checked {
   int i = (int)Math.Floor(d);
 }
于 2009-02-01T17:16:34.653 に答える
1

ボックス化された 10 進数 (つまり、オブジェクト型内の 10 進数値) がある場合、キャスト演算子が機能しないことがわかりました。この場合、 Convert.ToInt32(decimal as object) は正常に機能します。

この状況は、データベースから IDENTITY/AUTONUMBER 値を取得するときに発生します。

SqlCommand foo = new SqlCommand("INSERT INTO...; SELECT SCOPE_IDENTITY()", conn);
int ID = Convert.ToInt32(foo.ExecuteScalar());  // works
int ID = (int)foo.ExecuteScalar();              // throws InvalidCastException

4.3.2 ボックス化解除の変換を参照してください。

于 2009-04-24T19:20:26.327 に答える
0

10 進数を整数に変換する

decimal decimalValue=5.00;
int intValue=Convert.ToInt32(decimalValue);
于 2021-12-02T09:54:04.863 に答える