web-dev-qa-db-ja.com

C#でdoubleをintに変換する

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

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

誰がi1 != i2なのか説明できますか?

結果は、i1 = 9i2 = 8です。

81
Wouter Dorgelo

Convert.ToInt32 rounds:

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

...キャスト中 切り捨て

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

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

128
Jon

ダブルをキャストして、istをキャストできます。

(int)Math.Round(myDouble);
11
David

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

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

11
neilgmacy

提供された例では、小数は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
2
Evdzhan Mustafa

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

2
user146043