int countBouncy=5;
int count=999899;
double percent = (double)(countBouncy / count) * 100.0;
そのフレーズの結果は予想外で、私はゼロになります。
なぜうまくいかないのですか?
int countBouncy=5;
int count=999899;
double percent = (double)(countBouncy / count) * 100.0;
そのフレーズの結果は予想外で、私はゼロになります。
なぜうまくいかないのですか?
で整数除算を行ってい(countBouncy / count)
ます。コードを次のように変更します
double percent = ((double)countBouncy / count) * 100.0;
このように、countBouncy
はdouble
明示的に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
除算は整数除算であるため、結果は0になり、それをdoubleにキャストします。
現在のコードは実質的に次のものと同じです。
int temp = countBouncy / count; // == 0
double percent = (double)temp * 100.0;
最初にアイテムの1つにキャストしますか?
double percent = ((double)countBouncy / count) * 100.0;
これにより、除算が倍精度で前もって行われるようになります。
をで割るint
とint
、結果は常に。int
になるため、最も近い整数(ゼロ)に切り捨てられます。代わりにこれを試してください:
((double)countBouncy / count) * 100.0;
あなたの分子と分母は両方ともint
sです。したがって、結果の商は、int
C#が0に切り捨てて計算するものです。さらに、double
タイプをタイプに割り当てようとしていますint
。目的の結果を達成するには、次のようにします。
double percent = ((double) countBouncy / count) * 100.0;