Um ein Double zurückzugeben, muss ich auch double casten, auch wenn die Typen in c # doppelt sind?

7

Um ein Double zurückgeben, muss ich auch Double verdoppeln, wenn die Typen doppelt sind?

z.B.

%Vor%

Muss ich casten (double)?

    
yogurt 19.05.2009, 19:48
quelle

9 Antworten

19

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:

%Vor%

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%     
Jon Skeet 19.05.2009, 19:51
quelle
2

Nein, kein Casting ist nötig.

    
Daniel A. White 19.05.2009 19:49
quelle
2

Natürlich gibt es einen sauberen Weg, dies ohne Casting zu tun:

%Vor%     
Yes - that Jake. 19.05.2009 19:56
quelle
2

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.

    
Jason 19.05.2009 20:00
quelle
2

Hmm - Die Art, wie ich das für das Integer Division Problem gemacht habe, ist etwas wie:

%Vor%

Abgesehen von diesen, würde kein Casting benötigt werden.

    
Fry 19.05.2009 19:56
quelle
0

Das sollte nicht nötig sein, obwohl es schwer ist, aus deiner Frage zu sagen, wo die Besetzung sein würde.

    
Paul Sonier 19.05.2009 19:51
quelle
0

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):

  1. dezimal
  2. doppelt
  3. float
  4. lang / int64
  5. int / int32
  6. kurz / int16
  7. Byte

Das überspringt natürlich die unsignierten Versionen von jedem von diesen.

    
Powerlord 19.05.2009 19:51
quelle
0

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.

    
John Feminella 19.05.2009 19:51
quelle
0

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.

    
DevinB 19.05.2009 19:54
quelle

Tags und Links