134

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

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

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

私が得た結果は次のとおりです:i1 = 9i2 = 8

4

5 に答える 5

205

Convert.ToInt32ラウンドのため:

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

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

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

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

于 2012-05-25T12:17:30.817 に答える
16

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

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

于 2012-05-25T12:20:05.670 に答える
11

double とキャスト ist を丸めることができます。

(int)Math.Round(myDouble);
于 2012-05-25T12:20:04.000 に答える
7

提供された例では、小数は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
于 2018-05-18T12:37:25.580 に答える
1

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

于 2012-05-25T12:18:49.133 に答える