コードには、intに変換する必要があるdoubleがあります。
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
誰がi1 != i2
なのか説明できますか?
結果は、i1 = 9
とi2 = 8
です。
Convert.ToInt32
rounds:
戻り値:最も近い32ビット符号付き整数に丸められます。値が2つの整数の中間にある場合、偶数が返されます。つまり、4.5は4に変換され、5.5は6に変換されます。
...キャスト中 切り捨て :
Double値またはfloat値から整数型に変換すると、値は切り捨てられます。
更新:その他の違いについては、以下のJeppe Stig Nielsenのコメントを参照してください(ただし、score
が実数の場合は関係ありません)ここにケース)。
ダブルをキャストして、istをキャストできます。
(int)Math.Round(myDouble);
キャストは小数点以下を無視するため、8.6は8になります。
Convert.ToInt32(8.6)
は、doubleが最も近い整数(この場合は9)に丸められることを保証する安全な方法です。
提供された例では、小数は8.6です。 8.5または9.5だった場合、ステートメントi1 == i2は真だったかもしれません。実際、8.5ではtrue、9.5ではfalseでした。
説明:
2番目のステートメントであるint i2 = (int)score
は、小数部分に関係なく、小数部分を破棄し、単純に整数部分を返します。データ損失が発生する可能性があるため、非常に危険なことです。
さて、最初のステートメントでは、2つのことが起こります。小数部が5の場合、つまり、途中である場合は、決定が行われます。切り上げるか切り下げるかC#では、Convertクラスは銀行家の丸めを実装します。より詳細な説明については、 this answerを参照してください。数字が偶数の場合は切り捨て、数字が奇数の場合は切り上げます。
例えば。考慮してください:
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にキャストすると、非整数コンポーネントが破棄されます。