回答:
int
整数型です。2つのintを除算すると整数の除算が実行されます。つまり、小数部は結果の型に格納できないため(これもint
!)、切り捨てられます。Decimal
対照的に、は小数部分を持っています。を呼び出すDecimal.Divide
と、int
引数は暗黙的にDecimal
sに変換されます。
int
引数の少なくとも1つを明示的に浮動小数点型にキャストすることにより、引数に非整数除算を適用できます。例:
int a = 42;
int b = 23;
double result = (double)a / b;
最初のケースでは、整数の除算を行っているため、結果は切り捨てられ(小数部は切り捨てられます)、整数が返されます。
2番目のケースでは、intが最初に小数に変換され、結果は小数になります。したがって、それらは切り捨てられず、正しい結果が得られます。
次の行:
int a = 1, b = 2;
object result = a / b;
... 整数演算を使用して実行されます。Decimal.Divide
一方、はタイプの2つのパラメータを取るDecimal
ため、除算は整数値ではなく10進数値で実行されます。それはこれと同等です:
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
あなたは数字をキャストしたい:
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();
}
そのようにマークされた答えは非常に近くありますが、doubleとdecimalの使用には違いがあることを付け加えておく価値があります。
私はウィキペディアよりも概念を説明するより良い仕事をしないので、ポインタを提供するだけです:
金融システムでは、特定の(10を基数とする)小数点以下の桁数の精度を保証できることが要件になることがよくあります。入力/ソースデータが10進数である場合、これは一般的に不可能ですが、2進数で計算を実行します(数値の小数展開に必要な小数点以下の桁数は底に依存するため、1/3は無限に多くの10進数をとりますベース10で0.333333 ...として表現する場所ですが、ベース3では小数点以下1桁しかかかりません:0.1)。
浮動小数点数は(CPU時間の点で、プログラミングの観点からも同様に)処理が高速であり、丸め誤差を最小限にしたい場合はいつでも推奨されます(科学アプリケーションなど)。