Decimal.Divide(int、int)は機能するが、(int / int)は機能しないのはなぜですか?


105

どのように私には(int型/ int型)を返すように2つの32ビットのint型の数字を分割来る0が、私が使用している場合Decimal.Divide()、私は、正しい答えを得ますか?私は決してc#の男ではありません。


1
具体的な例を挙げていただけますか?DecimalはInt32とは異なる型です。
Groo、

ちなみに、Decimal.Divideは、小数のみを入力として取得しました。
Ravi

Decimal.Divideは、入力として整数に対しても機能します。
タマライT

回答:


214

int整数型です。2つのintを除算すると整数の除算が実行されます。つまり、小数部は結果の型に格納できないため(これもint!)、切り捨てられます。Decimal対照的に、は小数部分を持っています。を呼び出すDecimal.Divideと、int引数は暗黙的にDecimalsに変換されます。

int引数の少なくとも1つを明示的に浮動小数点型にキャストすることにより、引数に非整数除算を適用できます。例:

int a = 42;
int b = 23;
double result = (double)a / b;

2
素敵な答え。同じ結果が得られたDecimal.Divide(a、b)も試しました。
バクスター

6

最初のケースでは、整数の除算を行っているため、結果は切り捨てられ(小数部は切り捨てられます)、整数が返されます。

2番目のケースでは、intが最初に小数に変換され、結果は小数になります。したがって、それらは切り捨てられず、正しい結果が得られます。


4

次の行:

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

2

Iがreckon Decimal.Divide(decimal, decimal)暗黙ここ4/5としては整数除算戻る0として扱われる(正確)小数点値を返す前に小数点以下にその2つのint型の引数を変換します


1

あなたは数字をキャストしたい:

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();
        }

0

0 <a <1の回答を探している場合、int / intでは不十分です。int / intは整数除算を行います。操作の中で、intの1つをdoubleにキャストしてみてください。


1
Int32は符号付き整数ですが、0 <answer <1ですか?
Groo、

0

私の場合、上で何もうまくいきませんでした。

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を掛けます。


-1

そのようにマークされた答えは非常に近くありますが、doubleとdecimalの使用には違いがあることを付け加えておく価値があります。

私はウィキペディアよりも概念を説明するより良い仕事をしないので、ポインタを提供するだけです:

浮動小数点演算

10進データ型

金融システムでは、特定の(10を基数とする)小数点以下の桁数の精度を保証できることが要件になることがよくあります。入力/ソースデータが10進数である場合、これは一般的に不可能ですが、2進数で計算を実行します(数値の小数展開に必要な小数点以下の桁数は底に依存するため、1/3は無限に多くの10進数をとりますベース10で0.333333 ...として表現する場所ですが、ベース3では小数点以下1桁しかかかりません:0.1)。

浮動小数点数は(CPU時間の点で、プログラミングの観点からも同様に)処理が高速であり、丸め誤差を最小限にしたい場合はいつでも推奨されます(科学アプリケーションなど)。


1
あなたの応答には、元の質問への回答に役立つものはありません
ロードウィルモア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.