C#でdoubleをintに変換する


102

コードには、intに変換する必要があるdoubleがあります。

double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;

なぜ誰かが私に理由を説明できますかi1 != i2

私が得る結果はそれです:i1 = 9i2 = 8


5
Math.Truncate(score)より明確に意図を表明している(int)score
Lu55 '27

3
しかし、Math.Truncateはintではなくdoubleまたはdecimalを返します
Sergioet

回答:


162

なぜならConvert.ToInt32ラウンド:

戻り値:最も近い32ビット符号付き整数に丸められます。値が2つの整数の中間にある場合は、偶数が返されます。つまり、4.5は4に変換され、5.5は6に変換されます。

...キャストが切り捨てている間

doubleまたはfloat値から整数型に変換すると、値は切り捨てられます。

更新:その他の違いについては、以下のJeppe Stig Nielsenのコメントを参照してください(ただしscore、ここでのように、実数の場合は関係ありません)。


6
あなたのリンクは実際にそれを最もよく説明し、丸め切り捨てほど単純ではありません:タイプ:System.Int32値、最も近い32ビット符号付き整数に丸められます。値が2つの整数の中間にある場合は、偶数が返されます。それは、4.5は4に変換され、5.5は6に変換される
ericosg

@ericosg:場合ええ、それは違いを隠すだろうscoreだった8.5の代わりに8.6。引用を含めるように回答を更新しました。入力いただきありがとうございます。
2012年

5
scoreあるNaNか、無限または有限であるがの範囲外のInt32場合Convert.ToInt32、例外がスローされます。Castはを返しますが、コンテキスト内にあるためint、どれが(私の実装ではInt32.MinValue)かわかりませんunchecked。(checked状況に応じて、これらの場合にもキャストは例外をスローします。)
Jeppe Stig Nielsen '25

@JeppeStigNielsen:入力をありがとう、これについても言及するように回答を更新しました。
2012年

いいね。しかし、Doubleタイプ番号10000000000.6(10億ポイント6)は「実際の」番号だと思います。intその上にキャストを使用すると、奇妙な結果が得られます(checkedコンテキスト内にいる場合を除き、おそらくそうではありません)。
Jeppe Stig Nielsen、2012

13

キャストでは小数点以下は無視されるため、8.6は8になります。

Convert.ToInt32(8.6) doubleを最も近い整数(この場合は9)に丸めるための安全な方法です。


1
ボーナス質問-の価値場合の何が起こるかダブルに押し込むには大きすぎるint型?つまり、それがint.MAX_VALよりも高い場合は?
Konrad Viltersten 2016

1
@KonradViltersten例外をスローします値がInt32に対して大きすぎるか、または小さすぎます。
Vamsi

11

あなたはあなたのダブルを丸めて、キャストすることができます:

(int)Math.Round(myDouble);

4
問題は今どのように作るでしたi1 == i2。問題は、なぜ彼らが等しくないのかということでした。反対投票。
アダム

5

提供されている例では、10進数は8.6です。それが8.5または9.5であった場合、ステートメントi1 == i2 が真であった可能性があります。実際、8.5ではtrue、9.5ではfalseでした。

説明:

小数部に関係なく、2番目のステートメントint i2 = (int)scoreは小数部を破棄し、単に整数部を返します。データ損失が発生する可能性があるため、行うのは非常に危険です。

さて、最初のステートメントでは、2つのことが起こります。小数部が5の場合、つまり途中である場合は、決定が行われます。切り上げますか?C#では、Convertクラスは銀行員の丸めを実装します。詳細な説明については、この回答を参照してください。簡単に言えば、数値が偶数の場合は切り捨て、数値が奇数の場合は切り上げます。

例えば考慮してください:

        double score = 8.5;
        int i1 = Convert.ToInt32(score); // 8
        int i2 = (int)score;             // 8

        score += 1;
        i1 = Convert.ToInt32(score);     // 10
        i2 = (int)score;                 // 9

2

ToInt32ラウンド。intにキャストすると、整数以外のコンポーネントが破棄されます。

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