115

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

4

8 に答える 8

235

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

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

int a = 42;
int b = 23;
double result = (double)a / b;
于 2009-06-25T10:36:25.393 に答える
7

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

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

于 2009-06-25T10:37:20.227 に答える
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
于 2009-06-25T10:39:22.360 に答える
2

私はDecimal.Divide(decimal, decimal)、10進値(正確)を返す前に、その2つのint引数を10進数に暗黙的に変換すると考えています。ここで、4/5は整数除算として扱われ、0を返します。

于 2009-06-25T10:37:04.660 に答える
1

数字をキャストしたい:

double c =(double)a /(double)b;

注:C#の引数のいずれかがdoubleの場合、doubledivideが使用されて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();
        }
于 2017-03-08T07:16:28.087 に答える
0

0 <a <1の答えを探している場合、int/intでは不十分です。int/intは整数除算を行います。オペレーション内でintの1つをdoubleにキャストしてみてください。

于 2009-06-25T10:36:25.423 に答える
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も掛けます。

于 2018-10-12T12:22:38.777 に答える
-1

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

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

浮動小数点演算

10進データ型

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

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

于 2017-12-18T15:58:10.213 に答える