Nein, das tust du nicht. Allerdings wird Ihr Ausdruck mit ziemlicher Sicherheit nicht das tun, was Sie wollen.
Die Ausdrücke 1/12 und 3/12 werden mit Ganzzahl -Arithmetik ausgeführt.
Sie wollen wahrscheinlich:
%Vor%oder
%Vor%Beide werden die Division mit Gleitkommaarithmetik erzwingen.
Das Problem hierbei ist, dass, wenn beide Operanden eines arithmetischen Operators Ganzzahlen sind, die Operation mit Ganzzahlarithmetik durchgeführt wird, , auch wenn sie Teil eines größeren Ausdrucks vom Typ double
ist. Hier ist Ihr Ausdruck effektiv:
Die Addition und Subtraktion ist in Ordnung, weil die Typen a
und b
sie mit Gleitkomma-Arithmetik erzwingen - aber weil Division "fester bindet" als Addition und Subtraktion (dh es ist wie mit den Klammern oben) werden nur die unmittelbaren Operanden berücksichtigt.
Macht das Sinn?
BEARBEITEN: Da es so beliebt ist, ist es sinnvoll, auch hier den Kommentar von devinb einzutragen:
%Vor%Was den Compiler betrifft, ist das alles dasselbe - Sie müssen nur entscheiden, was für Sie klarer ist:
%Vor%Natürlich gibt es einen sauberen Weg, dies ohne Casting zu tun:
%Vor%Das hängt wirklich davon ab, was Sie beim Casting fragen. Hier sind zwei verschiedene Fälle:
%Vor%In beiden Fällen werden Sie keine Beschwerden über die Zuweisung des Werts an das Ergebnis erhalten, aber im ersten Fall wird die Division am Ende mit Ganzzahlen durchgeführt, die zu 0 aufgelöst werden.
Das sollte nicht nötig sein, obwohl es schwer ist, aus deiner Frage zu sagen, wo die Besetzung sein würde.
Wenn Sie Mathematik ausführen, gibt C # das Ergebnis als den Typ des jeweils größeren Arguments zurück.
Wie ich mich erinnere, geht die Reihenfolge so (vom größten zum kleinsten):
Das überspringt natürlich die unsignierten Versionen von jedem von diesen.
Im Allgemeinen wird kein Casting benötigt, aber in Ihrem Beispiel sind 1/12
und 3/12
ganzzahlige Division, was zu 0 für jeden Ausdruck führt. Sie müssten einen der Zähler oder den Nenner auf double
setzen.
Casting wird verwendet, um anzugeben, wann immer Sie einen Datentyp in einen anderen Typ ändern möchten. Dies liegt daran, dass die Änderung von type
normalerweise einen möglichen Datenverlust zur Folge hat.
z.B.
%Vor%In diesem Beispiel wird 'b' den Wert von "8.00000 ..." haben, weil a_int keine BIS-dezimalen Informationen enthält und somit b nur die ganzzahlige Information zur Verfügung hat.