私のプログラミング知識を許してください。これは簡単なことだと思いますが、結果が常に 0 になる理由がわかりません。
int a = 100;
int b = 200;
decimal c = (a / b) * 100;
どうもありがとう。
私のプログラミング知識を許してください。これは簡単なことだと思いますが、結果が常に 0 になる理由がわかりません。
int a = 100;
int b = 200;
decimal c = (a / b) * 100;
どうもありがとう。
整数除算は常に余りを切り捨てます。これは、数値が変数に割り当てられたときではなく、数値が除算されたときに行われます (私が推測しているように)。
decimal c = ((decimal)a / b) * 100;
値 a/b は整数であるため、常に 0 を返します。したがって、括弧内の値が評価されるとき、技術的にこれを行っています
decimal c = (0) * 100
したほうがいい、
decimal c = ((decimal)a/(decimal)b) * 100
100 / 200 は 1/2 または 0.5 です。int を使用しているため、0 (ゼロ) に切り捨てられます。0 * 100 は 0 のままです。括弧内の部分は常に最初に評価されます。これを機能させたい場合は、次を使用します。
decimal c = (a * 100) / b;
編集:「整数パーセンテージ」(つまり、33% ではなく 33.333%) ではなく、より正確な値が必要な場合は、Bragaadeesh の回答を使用する必要があります。
整数演算が実行され、結果が10 進数として格納されます。整数演算の 100 / 200 は 0 です。パーセンテージを取得するには、計算を行う前に少なくとも 1 つの値を 10 進数にキャストします。
decimal c = (a / (decimal)b) * 100;
強く型付けされた言語では、数学演算の結果は通常、大きい方の型と同じ型になります。
C#には、実行する暗黙的な数値変換のリストがあります。
このリストの一般化:整数型は浮動小数点型に変換できますが、その逆はできません。整数型も暗黙的にに変換できますdecimal
が、浮動小数点型は変換できません。
注:これは、intの1つを別のタイプにキャストすると、回答全体がそのタイプになることも意味します。元:(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)
行われている計算は、依然として整数計算です。
(a/b) (100/200 または 1/2) は 2 つの整数に対して実行されるため、結果はゼロになります。ゼロ * 100 は ... まあ、それでもゼロです。
発生している問題は、演算の順序にあります (a と b は整数であるため、整数演算が実行されます)。
私はこれを提案します:
decimal c=((decimal)a)/((decimal)b)*100;
これにより、求めている 10 進数値に対して実行される計算が強制されます。
整数を使用している場合、この「/」はDIVを表し、この「%」はMODを表します。DIVは除算の商であり、MODは残りです。したがって、100/200 = 0および100%200=100です。
したがって、あなたの場合は、に変更a
してb
入力する必要がありdecimal
ます。
成功するdecimal c = (a * 100) / b;
int は整数にしかできないため、100/200 は 0 になります。0*100 は 0 のままです。型を 10 進数に変更すると機能します。