157

C# の整数除算が float ではなく整数を返す理由を知っている人はいますか? その背後にあるアイデアは何ですか?(C/C++ の遺産だけですか?)

C# の場合:

float x = 13 / 4;   
//== operator is overridden here to use epsilon compare
if (x == 3.0)
   print 'Hello world';

このコードの結果は次のようになります。

'Hello world'

厳密に言えば、整数除算のようなものはありません (定義による除算は、有理数を生成する操作であり、整数はその非常に小さなサブセットです)。

4

8 に答える 8

117

新しいプログラマーが浮動小数点除算を実際に使用するつもりだったときに整数除算を実行するというこの間違いを犯すことはよくありますが、実際には整数除算は非常に一般的な操作です。人々がそれをめったに使用せず、除算を行うたびに浮動小数点にキャストすることを常に覚えておく必要があると想定している場合、あなたは間違っています。

まず、整数除算はかなり高速であるため、整数の結果のみが必要な場合は、より効率的なアルゴリズムを使用することをお勧めします。

次に、整数除算を使用するアルゴリズムが多数あり、除算の結果が常に浮動小数点数である場合、毎回結果を丸める必要があります。私の頭のてっぺんから離れた1つの例は、数の基数を変更することです。各桁の計算には、数値の浮動小数点除算ではなく、整数除算と剰余が含まれます。

これらの (およびその他の関連する) 理由により、整数除算の結果は整数になります。2 つの整数の浮動小数点除算を取得したい場合は、一方を // にキャストすることを覚えておく必要がdoubleありfloatますdecimal

于 2012-06-01T13:42:56.320 に答える
82

C#仕様を参照してください。除算演算子には 3 種類あります

  • 整数除算
  • 浮動小数点除算
  • 小数除算

あなたの場合、次のルールが適用された整数除算があります。

除算は結果をゼロに向けて丸め、結果の絶対値は、2 つのオペランドの商の絶対値より小さい可能な最大の整数です。2 つのオペランドの符号が同じ場合、結果はゼロまたは正になり、2 つのオペランドの符号が反対の場合、結果はゼロまたは負になります。

C# が整数に対してこのタイプの除算を使用する理由 (一部の言語は浮動小数点の結果を返す) は、ハードウェアにあると思います。整数の除算はより高速で単純です。

于 2012-06-01T13:34:42.617 に答える
46

各データ型は、各演算子をオーバーロードできます。分子と分母の両方が整数の場合、整数型は除算演算を実行し、整数型を返します。浮動小数点除算が必要な場合は、数値を除算する前に、1 つ以上の数値を浮動小数点型にキャストする必要があります。例えば:

int x = 13;
int y = 4;
float x = (float)y / (float)z;

または、リテラルを使用している場合:

float x = 13f / 4f;

浮動小数点は正確ではないことに注意してください。精度が気になる場合は、代わりに decimal 型などを使用してください。

于 2012-06-01T13:42:40.060 に答える
12

接尾辞を使用しないため、リテラル134は整数として解釈されます。

マニュアル:

リテラルに接尾辞がない場合、その値を表すことができる次の型の最初のものを持ちます: intuint、。longulong

したがって、整数として宣言する13ため、整数除算が実行されます。

マニュアル:

x / y 形式の操作の場合、バイナリ演算子のオーバーロード解決が適用され、特定の演算子の実装が選択されます。オペランドは選択した演算子のパラメーターの型に変換され、結果の型は演算子の戻り値の型になります。

定義済みの除算演算子を以下に示します。すべての演算子は、x と y の商を計算します。

整数除算:

int operator /(int x, int y);
uint operator /(uint x, uint y);
long operator /(long x, long y);
ulong operator /(ulong x, ulong y);

したがって、切り捨てが発生します。

除算は結果をゼロに向けて丸め、結果の絶対値は、2 つのオペランドの商の絶対値より小さい可能な最大の整数です。2 つのオペランドの符号が同じ場合、結果はゼロまたは正になり、2 つのオペランドの符号が反対の場合、結果はゼロまたは負になります。

次の場合:

int x = 13f / 4f;

浮動小数点除算 ( の/演算子13f) の結果が float になり、 int に暗黙的にキャストできないため、コンパイラ エラーが発生します。

除算を浮動小数点除算にしたい場合は、結果を浮動小数点にする必要があります。

float x = 13 / 4;

暗黙的に float にキャストされる整数を引き続き除算することに注意してください。結果は になります3.0fサフィックス ( 13f, )を使用して、オペランドを float として明示的に宣言します4f

于 2012-06-01T13:35:48.117 に答える
11

役に立つかもしれません:

double a = 5.0/2.0;   
Console.WriteLine (a);      // 2.5

double b = 5/2;   
Console.WriteLine (b);      // 2

int c = 5/2;   
Console.WriteLine (c);      // 2

double d = 5f/2f;   
Console.WriteLine (d);      // 2.5
于 2016-11-07T22:17:16.113 に答える
9

基本的な操作です。

割り算を学んだときのことを思い出してください。最初に解決し9/6 = 1 with remainder 3ました。

9 / 6 == 1  //true
9 % 6 == 3 // true

/-operator と %-operator の組み合わせは、これらの値を取得するために使用されます。

于 2014-02-28T20:10:05.313 に答える
1

何を取得しているかを知るためのちょっとしたトリックとして、varを使用できるため、コンパイラは期待する型を教えてくれます。

int a = 1;
int b = 2;
var result = a/b;

コンパイラは、結果がここではint型になることを通知します。

于 2020-11-18T17:58:06.777 に答える