2つの32ビット整数を(int/int)が_0
_に戻るように分割するのはなぜですか?しかし、Decimal.Divide()
を使用すると正しい答えが得られますか?私は決してC#の男ではありません。
int
は整数型です。 2つのintを除算するとinteger除算が実行されます。つまり、結果の型(int
!)に格納できないため、小数部は切り捨てられます。対照的に、Decimal
は小数部分を持っています。 Decimal.Divide
を呼び出すと、int
引数が暗黙的にDecimal
sに変換されます。
少なくとも1つの引数を明示的に浮動小数点型にキャストすることにより、int
引数に非整数除算を強制できます。
int a = 42;
int b = 23;
double result = (double)a / b;
最初のケースでは、整数除算を実行しているため、結果は切り捨てられ(小数部は切り捨てられます)、整数が返されます。
2番目の場合、intは最初に10進数に変換され、結果は10進数になります。したがって、それらは切り捨てられず、正しい結果が得られます。
次の行:
int a = 1, b = 2;
object result = a / b;
... 整数演算を使用して実行されます。一方、Decimal.Divide
はDecimal
型の2つのパラメーターを受け取るため、整数値ではなく小数値で除算が実行されます。これはこれと同等です:
int a = 1, b = 2;
object result = (Decimal)a / (Decimal)b;
これを調べるために、上記の各例の後に次のコード行を追加できます。
Console.WriteLine(result.ToString());
Console.WriteLine(result.GetType().ToString());
最初の場合の出力は次のようになります
0
System.Int32
..そして2番目の場合:
0,5
System.Decimal
Decimal.Divide(decimal, decimal)
は暗黙的に2つのint引数を10進数に変換してから、4/5が整数除算として扱われ、0を返します。
数字をキャストしたい:
double c =(double)a /(double)b;
注:C#の引数のいずれかがdoubleの場合、double除算が使用され、その結果doubleになります。そのため、以下も機能します。
double c =(double)a/b;
ここに小さなプログラムがあります:
static void Main(string[] args)
{
int a=0, b = 0, c = 0;
int n = Convert.ToInt16(Console.ReadLine());
string[] arr_temp = Console.ReadLine().Split(' ');
int[] arr = Array.ConvertAll(arr_temp, Int32.Parse);
foreach (int i in arr)
{
if (i > 0) a++;
else if (i < 0) b++;
else c++;
}
Console.WriteLine("{0}", (double)a / n);
Console.WriteLine("{0}", (double)b / n);
Console.WriteLine("{0}", (double)c / n);
Console.ReadKey();
}
私の場合、上記で何も機能しませんでした。
278を575で割り、100を掛けてパーセンテージを求めます。
double p = (double)((PeopleCount * 1.0 / AllPeopleCount * 1.0) * 100.0);
%:48,3478260869565-> 278/575 ---> 0%:51,6521739130435-> 297/575 ---> 0
peopleCountに1.0を掛けると、10進数になり、除算は48.34になります。また、100ではなく100.0を掛けます。
0 <a <1の答えを探している場合、int/intでは十分ではありません。 int/intは整数除算を行います。操作内でintの1つをdoubleにキャストしてみてください。