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

StackOverflow https://stackoverflow.com/questions/1043164

  •  20-08-2019
  •  | 
  •  

質問

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

役に立ちましたか?

解決

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

引数の少なくとも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はタイプ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進数に変換してから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();
        }

0を探している場合<!> lt; <!> lt; 1つの答え、int / intでは十分ではありません。 int / intは整数除算を行います。 intの1つを操作内でdoubleにキャストしてみてください。

私の場合、上記で何も機能しませんでした。

私がしたいのは、278を575で割り、100を掛けてパーセンテージを求めることです。

double p = (double)((PeopleCount * 1.0 / AllPeopleCount * 1.0) * 100.0);

%:48,3478260869565-<!> gt; 278/575 --- <!> gt; 0 %:51,6521739130435-<!> gt; 297/575 --- <!> gt; 0

PeopleCountに1.0を掛けると、10進数になり、除算は48.34になります... また、100ではなく100.0を掛けます。

そのようにマークされた答えはほとんどありますが、doubleとdecimalの使用には違いがあることを付け加える価値があると思います。

ウィキペディアよりも概念の説明が上手くいかないので、ポインタを提供します:

浮動小数点演算

10進データ型

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

浮動小数点数の処理は高速で(CPU時間の点で、プログラミング面でも同様に単純です)、丸め誤差を最小限に抑える場合(科学アプリケーションなど)に推奨されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top