10 進数を int に変換するにはどうすればよいですか?
13 に答える
できません。
もちろん、可能ですが、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));
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」を失っています。これは問題ないかもしれませんが、それについて明示し、明示的なキャストを行って、情報が失われる可能性があることを示す必要があります。
decimal d = 2;
int i = (int) d;
これで問題なく動作するはずです。
System.Decimal
メンバーIConvertable
を持つインターフェイスを実装します。ToInt32()
電話System.Decimal.ToInt32()
はあなたのために働いていますか?
小数を最も近い整数に丸める
decimal a ;
int b = (int)(a + 0.5m);
いつa = 49.9
、そしてb = 50
いつa = 49.5
、そしてb = 50
いつa = 49.4
、その後b = 49
など
素早い丸めの巧妙な方法は、小数を 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
ます。
Math.Round、Math.Floor、Math.CeilingまたはMath.Truncateを使用して、丸めモードを適切に明示的に設定することを好みます。
これらはすべて Decimal も返すことに注意してください。Decimal は Int32 よりも値の範囲が広いため、キャスト (およびオーバーフロー/アンダーフローのチェック) が必要になります。
checked {
int i = (int)Math.Floor(d);
}
ボックス化された 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 ボックス化解除の変換を参照してください。
10 進数を整数に変換する
decimal decimalValue=5.00;
int intValue=Convert.ToInt32(decimalValue);