/ / Warum gibt die Ganzzahldivision in C # eine Ganzzahl und nicht einen Float zurück? - c #, Division

Warum gibt Ganzzahldivision in C # eine Ganzzahl und nicht einen Gleitkommawert zurück? - c #, Abteilung

Weiß jemand, warum die Ganzzahleinteilung in C # eine Ganzzahl und nicht einen Float zurückgibt? Was ist die Idee dahinter? (Ist es nur ein Erbe von C / C ++?)

In C #:

float x = 13 / 4;
//imagine I used have an overridden == operator here to use epsilon compare
if (x == 3.0)
print "Hello world";

Ergebnis dieses Codes wäre:

"Hello world"

Streng genommen gibt es keine Integer-Division (Division nach Definition ist eine Operation, die eine rationale Zahl erzeugt, Integer sind eine sehr kleine Teilmenge davon.)

Antworten:

58 für die Antwort № 1

Während es für neue Programmierer üblich ist, zu machenBei diesem Fehler der Integer-Division, wenn eigentlich Gleitkommadivision verwendet werden soll, ist die Integer-Division in der Praxis eine sehr häufige Operation. Wenn Sie davon ausgehen, dass die Leute es selten verwenden, und dass Sie sich bei jeder Division immer daran erinnern müssen, an Floating Points zu arbeiten, dann liegen Sie falsch.

Zunächst ist die Ganzzahldivision etwas schneller. Wenn Sie also nur ein ganzzahliges Ergebnis benötigen, möchten Sie den effizienteren Algorithmus verwenden.

Zweitens gibt es eine Reihe von AlgorithmenVerwenden Sie eine Ganzzahldivision, und wenn das Ergebnis der Division immer eine Gleitkommazahl war, müssen Sie das Ergebnis jedes Mal runden. Ein Beispiel aus meinem Kopf ist das Ändern der Basis einer Zahl. Die Berechnung jeder Ziffer beinhaltet die ganzzahlige Division einer Zahl zusammen mit dem Rest und nicht die Fließkomma-Division der Zahl.

Aufgrund dieser (und anderer verwandter) Gründe führt eine Ganzzahldivision zu einer Ganzzahl. Wenn Sie die Fließkommaunterteilung von zwei ganzen Zahlen erhalten möchten, müssen Sie nur daran denken, eine in eine zu konvertieren double/float/decimal.


66 für die Antwort № 2

Siehe c # Spezifikation. Es gibt drei Arten von Bereichsoperatoren

  • Ganzzahlige Division
  • Fließkommadivision
  • Dezimalteilung

In Ihrem Fall haben wir die Integer-Division mit folgenden Regeln:

Die Division rundet das Ergebnis gegen Null ab, undder absolute Wert von Das Ergebnis ist die größtmögliche ganze Zahl, die kleiner als die ist absoluter Wert des Quotienten der beiden Operanden. Das Ergebnis ist Null oder positiv, wenn die beiden Operanden das gleiche Vorzeichen und Null oder haben negativ, wenn die beiden Operanden entgegengesetzte Vorzeichen haben.

Ich denke, der Grund, warum C # diese Art von Division für Ganzzahlen verwendet (einige Sprachen geben schwebendes Ergebnis zurück), ist Hardware - Ganzzahlen-Division ist schneller und einfacher.


26 für die Antwort № 3

Jeder Datentyp kann jeden überladenOperator. Wenn sowohl der Zähler als auch der Nenner Ganzzahlen sind, führt der Integer-Typ die Division aus und gibt einen Integer-Typ zurück. Wenn Sie eine Gleitkommadivision wünschen, müssen Sie einen oder mehrere der Anzahl in Gleitkommatypen umwandeln, bevor Sie sie teilen. Zum Beispiel:

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

oder, wenn Sie Literale verwenden:

float x = 13f / 4f;

Beachten Sie, dass Fließpunkte nicht genau sind. Wenn Sie Wert auf Präzision legen, verwenden Sie stattdessen etwas wie den Dezimaltyp.


10 für die Antwort № 4

Da Sie kein Suffix verwenden, die Literale 13 und 4 werden als ganze Zahl interpretiert:

Handbuch:

Wenn das Literal kein Suffix hat, hat es den ersten dieser Typen, in dem sein Wert dargestellt werden kann: int, uint, long, ulong.

Also, da erklärst du 13 Als Ganzzahl wird eine Ganzzahlaufteilung ausgeführt:

Handbuch:

Für eine Operation der Form x / y, binärÜberlastauflösung für Operatoren wird angewendet, um eine bestimmte Operatorimplementierung auszuwählen. Die Operanden werden in die Parametertypen des ausgewählten Operators konvertiert. Der Typ des Ergebnisses ist der Rückgabetyp des Operators.

Die vordefinierten Abteilungsoperatoren sind unten aufgeführt. Alle Operatoren berechnen den Quotienten von x und y.

Integer Division:

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

Und so kommt es zu einer Abrundung:

Die Division rundet das Ergebnis auf Null undDer absolute Wert des Ergebnisses ist die größtmögliche ganze Zahl, die unter dem absoluten Wert des Quotienten der beiden Operanden liegt. Das Ergebnis ist Null oder positiv, wenn die beiden Operanden dasselbe Vorzeichen haben, und Null oder negativ, wenn die beiden Operanden entgegengesetzte Vorzeichen haben.

Wenn Sie Folgendes tun:

int x = 13f / 4f;

Sie erhalten einen Compiler-Fehler, da eine Gleitkommadivision (die / Betreiber von 13f) führt zu einem Float, der nicht implizit in int umgewandelt werden kann.

Wenn Sie möchten, dass die Division eine Gleitkommadivision ist, müssen Sie das Ergebnis als Float definieren:

float x = 13 / 4;

Beachten Sie, dass Sie immer noch ganze Zahlen teilen, die implizit in Float umgewandelt werden: Das Ergebnis wird sein 3.0. Um die Operanden explizit als Float zu deklarieren, verwenden Sie die f Suffix (13f, 4f).


6 für die Antwort № 5

Es ist nur ein Grundbetrieb.

Denken Sie daran, wann Sie gelernt haben zu teilen. Am Anfang haben wir gelöst 9/6 = 1 with remainder 3.

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

Der / -Operator wird in Kombination mit dem% -Operator verwendet, um diese Werte abzurufen.


1 für die Antwort № 6

Könnte nützlich sein:

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

1 für die Antwort № 7

Das Ergebnis wird immer vom Typ sein, der den größeren Bereich des Zählers und des Nenners hat. Die Ausnahmen sind Byte und Short, die Int (Int32) erzeugen.

var a = (byte)5 / (byte)2;  // 2 (Int32)
var b = (short)5 / (byte)2; // 2 (Int32)
var c = 5 / 2;              // 2 (Int32)
var d = 5 / 2U;             // 2 (UInt32)
var e = 5L / 2U;            // 2 (Int64)
var f = 5L / 2UL;           // 2 (UInt64)
var g = 5F / 2UL;           // 2.5 (Single/float)
var h = 5F / 2D;            // 2.5 (Double)
var i = 5.0 / 2F;           // 2.5 (Double)
var j = 5M / 2;             // 2.5 (Decimal)
var k = 5M / 2F;            // Not allowed

Es gibt keine implizite Konvertierung zwischenFließkomma-Typen und der Dezimaltyp, sodass eine Trennung zwischen ihnen nicht zulässig ist. Sie müssen explizit umsetzen und entscheiden, welche Sie möchten (Dezimal hat mehr Genauigkeit und einen kleineren Bereich als Fließkommatypen).