Strange Swift Zahlen geben Casting ein

8

Ich habe gerade bemerkt, dass Swift eine Art Casting über Int und Double macht. Wenn ich versuche,

auszuwerten %Vor%

0.333... wird erwartet, aber es ist tatsächlich 0.0 . Könnte das bitte jemand erklären?

    
Eugene Auduchinok 02.03.2015, 15:32
quelle

1 Antwort

12

Ja, das fand ich auch ziemlich überraschend. Double entspricht sowohl FloatLiteralConvertible als auch IntegerLiteralConvertible ( ExpressibleByFloatLiteral und ExpressibleByIntegerLiteral in Swift 3). Daher a Double kann mit Fließkomma-Literal

initialisiert werden %Vor%

oder mit einem Ganzzahl-Literal :

%Vor%

(Das gleiche gilt für andere Gleitkommatypen wie Float und CGFloat .)

Nun könnte es für uns alle mit einem (Objektiven-) C-Hintergrund unerwartet sein dass beide Anweisungen

%Vor%

Weisen Sie der Variablen den Wert 0.25 zu. Aus dem Kontext ergibt sich das Ergebnis der Division muss ein Double sein, und Swift konvertiert Typen nicht implizit. Daher muss / muss der Gleitkommadivisionsoperator

sein %Vor%

Der Compiler erstellt also beide Argumente als Double s aus den Literalen "10" und "4". (Wenn 10/4 als Division von zwei ganzen Zahlen behandelt wurde dann wäre das Ergebnis auch eine Ganzzahl, und das kann nicht zugewiesen werden zu einem Double .)

Beachten Sie, dass sich dies von

unterscheidet %Vor%

, das eine Ganzzahl-Division durchführt und das Ergebnis in Double umwandelt. Double hat einen init(_ v: Int) -Konstruktor und daher 10/4 kann hier als Division zweier Ganzzahlen behandelt werden.

Es sieht wirklich ein bisschen komisch aus, wenn wir diese Ergebnisse zusammenfassen:

%Vor%

Jetzt können wir diese Ergebnisse auf Ihren Ausdruck anwenden

%Vor%

Der erste Teil (10 / 3.0) kann nur ein Double sein, also - muss der Gleitkomma-Subtraktionsoperator

sein %Vor%

und somit (10 / 3) muss auch ein Double sein. Auch hier muss / der Gleitkommadivisionsoperator sein, also werden 10 und 3 als Double Konstanten behandelt.

Daher entspricht der Ausdruck

%Vor%

und ergibt 0.0 . Wenn Sie den Ausdruck in

ändern %Vor%

dann ist das Ergebnis 0.333... , weil in diesem Zusammenhang 10 / 3 ist die Division von zwei ganzzahligen Konstanten, wie oben erklärt.

    
Martin R 02.03.2015, 15:43
quelle

Tags und Links