私たちのコードには、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値から整数型に変換すると、値は切り捨てられます。
更新:score
追加の違いについては、以下のJeppe Stig Nielsenのコメントを参照してください(ただし、ここでの場合のように実数の場合は機能しません)。
キャストでは小数点以下は無視されるため、8.6 は 8 になります。
Convert.ToInt32(8.6)
double が最も近い整数 (この場合は 9) に丸められることを保証する安全な方法です。
double とキャスト ist を丸めることができます。
(int)Math.Round(myDouble);
提供された例では、小数は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 にキャストすると、整数以外のコンポーネントが破棄されます。