web-dev-qa-db-ja.com

C#で10進数をintに変換する方法

10進数をintに変換する方法

208
Neil P

以下のようにmscorlibからConvert.ToInt32を使用します。

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

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

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

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

253
jason

できません。

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

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

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

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

本当の質問は、「何をしようとしているのですか?」です。あなたの要件を知らないと、誰もあなたがすべきだと言うことはできません、この場合、明白なことを除いて:それをしないでください。

特に気にしない場合、ここでの回答は有効です。ただし、communicateオーバーフローが発生する可能性があり、キャストコードをuncheckedブロック

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));
68
Will
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"を失っています。これは大丈夫かもしれませんが、あなたはそれについてはっきりしている必要があり、あなたが情報を失っている可能性があることをあなたに示すためにはっきりとキャストしなければなりません。

43
ICR
decimal d = 2;
int i = (int) d;

これはうまくいくはずです。

20
luiscubal
decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);

これは他の人のための非常に便利な変換データ型Webページです。 http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html

11
Darren

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

System.Decimal.ToInt32()を呼び出すことはあなたのために働きますか?

8
Andy

速い丸めのためのきちんとしたトリックはあなたがintにあなたの10進数をキャストする前に0.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というように切り上げます。

7
DeadlyBrad42

decimal d = 5.5;

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

ref: リンクテキスト

6
__w

Math.RoundMath.FloorMath.Ceiling を使うのが好きです。丸めモードを適切に設定するには、 Math.Truncate を使用します。

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

 checked {
   int i = (int)Math.Floor(d);
 }
6
Mark Brackett

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

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

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

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

a = 49.4b = 49などの場合.

5
sleepwalkerfx

私はあなたが箱入りの10進数(すなわち、オブジェクト型の中の10進値)を持っているならばキャスト演算子が働かないことに気付く。この場合、Convert.ToInt32(オブジェクトとしての10進数)は正常に機能します。

データベースから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ボックス化解除の変換 を参照してください

0
Timbo