doubleをintに変換する


156

変換するための最良の方法は何であるdoubleにはint?キャストを使用する必要がありますか?


7
「最高」を定義します。切り上げ/切り下げなどが必要かどうかによって異なります
RPM1984年

8
@ RPM1984:定義しますetc.:)
Armen Tsirunyan '15年

18
@Armen-touche` :)とにかく重要ではありません-スキートがここにあり、それ以外は重要ではありません。
RPM1984

回答:


237

デフォルトのゼロに切り捨てる動作が必要な場合は、キャストを使用できます。また、あなたが使用することをお勧めしますMath.CeilingMath.RoundMath.Floorなど-あなたはまだ、その後、キャストが必要になりますが。

の範囲がの範囲intよりもはるかに小さいことを忘れないでくださいdouble。以下からのキャストdoubleには、int値の範囲外にある場合は例外をスローしませんint未確認のコンテキストでの呼び出しに対し、Convert.ToInt32(double)意志。値が範囲外の場合、(チェックされていないコンテキストでの)キャストの結果は明示的に未定義です。


24
@user:int32ビットマシンと64ビットマシンのどちらを使用しているかに関係なく、anのサイズは常に32ビットです。
ジョレン

3
また、doubleは64ビットintよりもはるかに大きくなる可能性があります。
エイドリアン・ラトナパラ2013年

7
私のようなC#初心者の場合:MathとConvertはどちらもSystemの一部です。このような完全な答えのルックスだから:intVal = System.Convert.ToInt32(System.Math.Floor(dblVal));
クリス

9
@ user1290746:これでうまくいきますが、通常using System;はファイルの先頭にあるはずですが、その時点でそれが正しい可能性がありますintVal = Convert.ToInt32(Math.Floor(dblVal));
Jon Skeet

3
@ user1290746:しかし、その場合、適切な解決策は完全修飾名を使用するように人々に助言することではないと思います-より良い解決策はusingディレクティブについて学ぶことです。
Jon Skeet、2016年

39

キャストを使用する場合、つまり(int)SomeDouble、小数部分を切り捨てます。つまり、SomeDouble4.9999の場合、結果は5ではなく4になります。intに変換しても数値は丸められません。丸めが必要な場合Math.Round


34

うん、どうして?

double someDouble = 12323.2;
int someInt = (int)someDouble;

Convertクラスの使用もうまくいきます。

int someOtherInt = Convert.ToInt32(someDouble);


4

最善の方法は、単にを使用することConvert.ToInt32です。これは高速で、正しく丸められます。

なぜもっと複雑にするのですか?


2

ここに完全な例があります

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



0

私のやり方は:

 - Convert.ToInt32(double_value)
 - (int)double_value
 - Int32.Parse(double_value.ToString());

11
3番目の方法は不必要に複雑で遅いと思いませんか?
Armen Tsirunyan 2010年

6
3番目は、小数部を持つdoubleでは機能しません。例double_value = 0.1
ジェフメルカド

Math.Floorが使えると思います。
lindexi 2017

0
label8.Text = "" + years.ToString("00") + " years";

ラベルなどに送信したいが、小数コンポーネントは必要ない場合は、これが最良の方法です

label8.Text = "" + years.ToString("00.00") + " years";

あなたが2つだけで欲しいなら、それはいつもそのようです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.