なぜ私はのIntを使用してパーセンテージを得ることができません
-
25-09-2019 - |
質問
私のプログラミングの知識はご容赦下さい。私は、これは単純なことですけど、小数点以下の罰金になるのはなぜ結果は常に0である理由私は理解していない?
int a = 100;
int b = 200;
decimal c = (a / b) * 100;
感謝します。
解決
整数除算は常に剰余を切り捨て。これは数が分割されている時に行われ、のないのそれは(私は推測しているとして、あなたが想定さ)。変数に割り当てられているとき、
decimal c = ((decimal)a / b) * 100;
他のヒント
値/ bは常に0を返します。括弧内の値が評価されている場合だから、技術的には、
これをやっていますdecimal c = (0) * 100
より良い行い、
decimal c = ((decimal)a/(decimal)b) * 100
200分の100は1/2又は0.5です。あなたはint型を使用しているので、それが0(ゼロ)に切り捨て。そして、0 * 100は、括弧内の部分は常に最初に評価され、まだ0です:あなたはこの作業を取得したい場合は、使用します:
decimal c = (a * 100) / b;
編集:あなたは、より正確な値ではなく、「整数比率」(。つまり、代わりに33%の33.333パーセントを)したい場合、あなたはBragaadeeshの答えを使用する必要があります。
。整数演算が実行され、その結果は、次には小数として格納されています。整数演算では100/200は、計算を行う前に、小数点に少なくとも一つの値があなたの割合、キャストを取得するには0です。
decimal c = (a / (decimal)b) * 100;
強く型付けされた言語では、数学演算の結果は、通常より大きなタイプと同じタイプです。
C#、暗黙的な数値変換は、それがどうなるをのリストを持っていますます。
一般化リスト:積分型は浮動小数点型に変換することができるではなく、その逆。インテグラタイプも暗黙的にdecimal
に変換することができますが、浮動小数点型はできません。
注:別の型にint型のいずれかをキャストすると、そのタイプであること、全体の答えをもたらすことも、この手段。
例:(decimal) a / b * 100.0 = 50.0
TL; DR:
はC#:
int / int = int
int + decimal = decimal
decimal + int = decimal
int / int * decimal = (int / int = int) * decimal = decimal
int - float = float
int * double = double
float / decimal = an error
int - uint = an error (either that or ulong)
行われている数学は数学整数まだあります。
結果がゼロになるように(/ b)は(100/200又は1/2)、二つの整数で行われます。ゼロ* 100は...まあ、まだゼロます。
あなたが経験している問題は、操作の順序(aとbは数学が行われるので、整数、整数である)である。
私はこれを提案します
decimal c=((decimal)a)/((decimal)b)*100;
これは、あなたが求める小数点値に行っ数学を強制されます。
intが唯一100/200ように0 0 * 100はまだ10進数タイプの変更は0であることを行っている、全体の数字とすることができ、それが
に動作しますそれdecimal c = (a * 100) / b;
は、これは「/」DIVとMODのために、この「%」の略です。 DIVは除算の商で、MODは休みです。だから、100/200 = 0と100%200 = 100。
だから、あなたはあなたのケースでは、a
に変更しb
とdecimal
タイプにする必要があります。