double
をint
に変換する最良の方法は何ですか?キャストを使用する必要がありますか?
デフォルトのtruncate-towards-zero動作が必要な場合は、キャストを使用できます。または、Math.Ceiling
、Math.Round
、Math.Floor
などを使用することもできますが、後でキャストが必要になります。
int
の範囲がdouble
の範囲よりもはるかに小さいことを忘れないでください。 double
からint
へのキャストは、値が未チェックのコンテキストでint
の範囲外にある場合は例外をスローしませんが、Convert.ToInt32(double)
の呼び出しは例外をスローします。値が範囲外の場合、キャストの結果(チェックされていないコンテキストで)は明示的に未定義です。
キャスト、つまり(int)SomeDouble
を使用する場合、小数部分は切り捨てられます。つまり、SomeDouble
が4.9999の場合、結果は5ではなく4になります。intに変換しても数値は丸められません。丸めたい場合は、Math.Round
を使用します
ええ、なぜですか?
double someDouble = 12323.2;
int someInt = (int)someDouble;
Convert
クラスを使用してもうまくいきます。
int someOtherInt = Convert.ToInt32(someDouble);
Convert.ToInt32
は変換する最良の方法です
最善の方法は、単にConvert.ToInt32
を使用することです。それは高速であり、正しく丸められます。
なぜもっと複雑にするのですか?
ここに完全な例があります
class Example
{
public static void Main()
{
double x, y;
int i;
x = 10.0;
y = 3.0;
// cast double to int, fractional component lost (Line to be replaced)
i = (int) (x / y);
Console.WriteLine("Integer outcome of x / y: " + i);
}
}
数値をより近い整数に丸めるには、次のようにします
i = (int) Math.Round(x / y); // Line replaced
最善の方法はConvert.ToInt32
であると思います。
int myInt =(int)Math.Ceiling(myDouble);
label8.Text = "" + years.ToString("00") + " years";
ラベルなどに送信したいときに、小数部のコンポーネントが必要ない場合は、これが最善の方法です
label8.Text = "" + years.ToString("00.00") + " years";
あなたが2つだけで欲しいなら、それはいつもそのようなものです
私の方法は次のとおりです。
- Convert.ToInt32(double_value)
- (int)double_value
- Int32.Parse(double_value.ToString());