2
int countBouncy=5;
int count=999899;

double percent = (double)(countBouncy / count) * 100.0;

そのフレーズの結果は予想外で、私はゼロになります。

なぜうまくいかないのですか?

4

4 に答える 4

6

で整数除算を行ってい(countBouncy / count)ます。コードを次のように変更します

double percent = ((double)countBouncy / count) * 100.0;

このように、countBouncydouble明示的にcount変換さdoubleれ、c#コンパイラによって暗黙的に変換されて(現在double)と互換性がありcountBouncyます。

それ以外の場合は、両方が整数であるため、(countBouncy / count)として計算されます。(5 / 999899) --> 0


整数除算はどのように機能しますか?例を見てみましょう:

7 / 2 = 3

整数除算は、実際の除算で得られる小数部分を削除します。結果はゼロに向かって切り捨てられます。モジュロ演算子を使用して、この除算の余りを取得できます

7 % 2 = 1

このように逆算を実行します

2 * (7 / 2) + 7 % 2 = 7

Visual Studioのイミディエイトウィンドウにこれを入力して、次のようにテストできます。

?2 *(7/2)+ 7%2 <enter>
7

于 2012-10-13T00:03:55.953 に答える
2

除算は整数除算であるため、結果は0になり、それをdoubleキャストします。

現在のコードは実質的に次のものと同じです。

int temp = countBouncy / count;  // == 0
double percent = (double)temp * 100.0;

最初にアイテムの1つにキャストしますか?

double percent = ((double)countBouncy / count) * 100.0;

これにより、除算が倍精度で前もって行われるようになります。

于 2012-10-13T00:03:56.683 に答える
2

をで割るintint、結果は常に。intになるため、最も近い整数(ゼロ)に切り捨てられます。代わりにこれを試してください:

((double)countBouncy / count) * 100.0;
于 2012-10-13T00:05:00.780 に答える
2

あなたの分子と分母は両方ともintsです。したがって、結果の商は、intC#が0に切り捨てて計算するものです。さらに、doubleタイプをタイプに割り当てようとしていますint。目的の結果を達成するには、次のようにします。

double percent = ((double) countBouncy / count) * 100.0;
于 2012-10-13T00:06:23.280 に答える