Weiß jemand, warum die Ganzzahldivision in C # eine Ganzzahl und keinen Gleitkommawert zurückgibt? Was ist die Idee dahinter? (Ist es nur ein Erbe von C / C ++?)
In C #:
float x = 13 / 4;
//== operator is overridden here to use epsilon compare
if (x == 3.0)
print 'Hello world';
Ergebnis dieses Codes wäre:
'Hello world'
Genau genommen gibt es keine Ganzzahldivision (Division ist per Definition eine Operation, die eine rationale Zahl erzeugt, Ganzzahlen sind eine sehr kleine Teilmenge davon.)
integer
Teilung ist, nichtfloating point
Teilung.Antworten:
Während es für neue Programmierer üblich ist, diesen Fehler bei der Durchführung einer Ganzzahldivision zu machen, wenn sie tatsächlich die Gleitkommadivision verwenden wollten, ist die Ganzzahldivision in der Praxis eine sehr häufige Operation. Wenn Sie davon ausgehen, dass die Leute es selten verwenden und dass Sie jedes Mal, wenn Sie eine Teilung durchführen, daran denken müssen, auf Gleitkommawerte zu setzen, irren Sie sich.
Zunächst einmal ist die Ganzzahldivision viel schneller. Wenn Sie also nur ein Ergebnis mit ganzen Zahlen benötigen, sollten Sie den effizienteren Algorithmus verwenden.
Zweitens gibt es eine Reihe von Algorithmen, die eine ganzzahlige Division verwenden. Wenn das Ergebnis der Division immer eine Gleitkommazahl wäre, müssten Sie das Ergebnis jedes Mal runden. Ein Beispiel auf der Oberseite meines Kopfes ist das Ändern der Basis einer Zahl. Die Berechnung jeder Ziffer umfasst die ganzzahlige Division einer Zahl zusammen mit dem Rest und nicht die Gleitkommadivision der Zahl.
Aus diesen (und anderen verwandten) Gründen führt die Ganzzahldivision zu einer Ganzzahl. Wenn Sie die Gleitkommadivision von zwei ganzen Zahlen erhalten möchten, müssen Sie nur daran denken, eine in ein
double
//float
umzuwandelndecimal
.quelle
/
Operator eine Ganzzahl- oder Gleitkommadivision ausführt (es sei denn, Sie verwenden Dynamic). Wenn es für Sie schwierig ist , es herauszufinden, weil Sie so viel in dieser einen Zeile tun, würde ich vorschlagen, diese Zeile in mehrere Zeilen aufzuteilen, damit Sie leichter herausfinden können, ob die Operanden Ganzzahlen oder Gleitkommatypen sind. Zukünftige Leser Ihres Codes werden es wahrscheinlich zu schätzen wissen.int/int
Operator einfach illegal [mit einer Diagnose, die angibt, dass Code einen Operanden umwandeln oder den verwenden muss anderer Operator, je nachdem welches Verhalten gewünscht wurde]. Wäre eine andere gute Token-Sequenz für die Ganzzahldivision verfügbar, könnte es möglich sein, die Verwendung/
für diesen Zweck zu verwerfen , aber ich weiß nicht, was praktisch wäre.Siehe C # -Spezifikation . Es gibt drei Arten von Abteilungsoperatoren
In Ihrem Fall haben wir eine Ganzzahldivision mit folgenden Regeln:
Ich denke, der Grund, warum C # diese Art der Division für ganze Zahlen verwendet (einige Sprachen geben ein schwebendes Ergebnis zurück), ist Hardware - die Division von ganzen Zahlen ist schneller und einfacher.
quelle
Jeder Datentyp kann jeden Operator überlasten. Wenn sowohl der Zähler als auch der Nenner Ganzzahlen sind, führt der Ganzzahltyp die Divisionsoperation aus und gibt einen Ganzzahltyp zurück. Wenn Sie eine Gleitkommadivision wünschen, müssen Sie eine oder mehrere der Zahlen in Gleitkommatypen umwandeln, bevor Sie sie teilen. Zum Beispiel:
oder, wenn Sie Literale verwenden:
Beachten Sie, dass Gleitkommazahlen nicht präzise sind. Wenn Sie Wert auf Präzision legen, verwenden Sie stattdessen den Dezimaltyp.
quelle
Da Sie kein Suffix verwenden, werden die Literale
13
und4
als Ganzzahl interpretiert:Da Sie also
13
eine Ganzzahl deklarieren , wird eine Ganzzahldivision durchgeführt:Und so kommt es zu einer Abrundung:
Wenn Sie Folgendes tun:
Sie erhalten einen Compilerfehler, da eine Gleitkommadivision (der
/
Operator von13f
) zu einem Gleitkomma führt, das nicht implizit in int umgewandelt werden kann.Wenn Sie möchten, dass die Division eine Gleitkommadivision ist, müssen Sie das Ergebnis zu einem Float machen:
Beachten Sie, dass Sie immer noch Ganzzahlen teilen, die implizit in float umgewandelt werden: Das Ergebnis ist
3.0
. Um die Operanden explizit als float zu deklarieren, verwenden Sie dasf
Suffix (13f
,4f
).quelle
1.0
.Es ist nur eine grundlegende Operation .
Denken Sie daran, als Sie gelernt haben, sich zu teilen. Am Anfang haben wir gelöst
9/6 = 1 with remainder 3
.Der / -Operator in Kombination mit dem% -Operator wird verwendet, um diese Werte abzurufen.
quelle
Könnte nützlich sein:
quelle
2.5
, nicht2
.Das Ergebnis ist immer vom Typ, der den größeren Bereich des Zählers und des Nenners hat. Die Ausnahmen sind Byte und Short, die int (Int32) erzeugen.
Es gibt keine implizite Konvertierung zwischen Gleitkommatypen und dem Dezimaltyp, sodass eine Trennung zwischen ihnen nicht zulässig ist. Sie müssen explizit umwandeln und entscheiden, welche Sie möchten (Decimal hat eine höhere Genauigkeit und einen kleineren Bereich im Vergleich zu Gleitkommatypen).
quelle