コードには、intに変換する必要があるdoubleがあります。
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
なぜ誰かが私に理由を説明できますかi1 != i2
?
私が得る結果はそれです:i1 = 9
とi2 = 8
。
コードには、intに変換する必要があるdoubleがあります。
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
なぜ誰かが私に理由を説明できますかi1 != i2
?
私が得る結果はそれです:i1 = 9
とi2 = 8
。
回答:
なぜならConvert.ToInt32
ラウンド:
戻り値:最も近い32ビット符号付き整数に丸められます。値が2つの整数の中間にある場合は、偶数が返されます。つまり、4.5は4に変換され、5.5は6に変換されます。
...キャストが切り捨てている間:
doubleまたはfloat値から整数型に変換すると、値は切り捨てられます。
更新:その他の違いについては、以下のJeppe Stig Nielsenのコメントを参照してください(ただしscore
、ここでのように、実数の場合は関係ありません)。
score
だった8.5
の代わりに8.6
。引用を含めるように回答を更新しました。入力いただきありがとうございます。
score
あるNaN
か、無限または有限であるがの範囲外のInt32
場合Convert.ToInt32
、例外がスローされます。Castはを返しますが、コンテキスト内にあるためint
、どれが(私の実装ではInt32.MinValue
)かわかりませんunchecked
。(checked
状況に応じて、これらの場合にもキャストは例外をスローします。)
Double
タイプ番号10000000000.6
(10億ポイント6)は「実際の」番号だと思います。int
その上にキャストを使用すると、奇妙な結果が得られます(checked
コンテキスト内にいる場合を除き、おそらくそうではありません)。
キャストでは小数点以下は無視されるため、8.6は8になります。
Convert.ToInt32(8.6)
doubleを最も近い整数(この場合は9)に丸めるための安全な方法です。
提供されている例では、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
ToInt32ラウンド。intにキャストすると、整数以外のコンポーネントが破棄されます。
Math.Truncate(score)
より明確に意図を表明している(int)score