In unserem Code haben wir ein Double, das wir in ein Int konvertieren müssen.
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
Kann mir jemand erklären warum i1 != i2
?
Das Ergebnis, das ich bekomme, ist das: i1 = 9
und i2 = 8
.
Math.Truncate(score)
ist explizit ausdrückliche Absicht als(int)score
Antworten:
Weil
Convert.ToInt32
Runden:... während die Besetzung abschneidet :
Update: Weitere Unterschiede finden Sie im Kommentar von Jeppe Stig Nielsen (die jedoch nicht ins Spiel kommen, wenn
score
es sich um eine reelle Zahl handelt, wie dies hier der Fall ist).quelle
score
waren8.5
statt8.6
. Ich habe die Antwort aktualisiert, um die Anführungszeichen aufzunehmen. Danke für die Eingabe.score
esNaN
oder eine Unendlichkeit oder Endlichkeit ist, aber außerhalb des Bereichs vonInt32
, dannConvert.ToInt32
wird eine Ausnahme ausgelöst. Die Besetzung wird eine zurückgebenint
, aber Sie werden nicht wissen, welche (in meiner ImplementierungInt32.MinValue
), weil Sie sich imunchecked
Kontext befinden. (Sollten Sie imchecked
Kontext sein, wird die Besetzung auch in diesen Fällen eine AusnahmeDouble
Typennummer10000000000.6
(zehn Milliarden Punkt sechs) ist eine "echte" Zahl. Wenn Sie eine Besetzung verwendenint
, wird dies zu einem seltsamen Ergebnis führen (es sei denn, Sie befinden sich imchecked
Kontext, aber wahrscheinlich nicht).Beim Casting wird alles nach dem Dezimalpunkt ignoriert, sodass aus 8,6 8 wird.
Convert.ToInt32(8.6)
Dies ist der sichere Weg, um sicherzustellen, dass Ihr Double auf die nächste Ganzzahl gerundet wird, in diesem Fall 9.quelle
Sie können Ihr Doppel runden und werfen ist:
quelle
i1 == i2
. Die Frage war, warum sie nicht gleich sind. Abgestimmt.Im angegebenen Beispiel ist Ihre Dezimalstelle 8,6 . Wäre es 8,5 oder 9,5 gewesen, wäre die Aussage i1 == i2 möglicherweise wahr gewesen. Tatsächlich wäre es für 8.5 wahr und für 9.5 falsch gewesen.
Erläuterung:
Unabhängig vom Dezimalteil
int i2 = (int)score
verwirft die zweite Anweisung den Dezimalteil und gibt Ihnen einfach den ganzzahligen Teil zurück. Sehr gefährlich, da Datenverlust auftreten kann.Für die erste Aussage können nun zwei Dinge passieren. Wenn der Dezimalteil 5 ist, dh auf halbem Weg ist, muss eine Entscheidung getroffen werden. Runden wir auf oder ab? In C # implementiert die Convert-Klasse die Rundung des Bankiers. Sehen Sie das Informationen finden Antwort. Einfach ausgedrückt, wenn die Zahl gerade ist, runden Sie ab, wenn die Zahl ungerade ist, runden Sie auf.
ZB bedenken Sie:
quelle
ToInt32 Runden. Das Casting in int wirft nur die nicht ganzzahlige Komponente weg.
quelle