2017-08-03 5 views
1

Comme dans de nombreuses langues, les paramètres par défaut de l'opérateur de division Swift à division entière, donc:Pourquoi la conversion rapide fonctionne-t-elle pour la division à virgule flottante?

let n = 1/2 
print(n) // 0 

Si vous voulez flottante division de points, vous devez faire

let n1 = 1.0/2 
let n2 = 1/2.0 
let n3 = Double(1)/2 
let n4 = 1/Double(2) 

print(n1) // 0.5 
print(n2) // 0.5 
print(n3) // 0.5 
print(n4) // 0.5 

Encore une fois, comme la plupart des autres langues, vous ne peut pas lancer l'opération:

let n5 = Double(1/2) 
print(n5) // 0.0 

Ce qui se passe parce que rapide effectue la division entière de 1 et 2 (1/2) et obtient 0, qu'il essaye alors de lancer à un Double, en donnant effectivement 0.0.

Je suis curieux de savoir pourquoi les travaux suivants:

let n6 = (1/2) as Double 
print(n6) // 0.5 

Je me sens comme cela devrait produire les mêmes résultats que Double(1/2). Pourquoi pas?

+0

'Double (1/2)' n'est * pas * un cast; c'est une * conversion * de 'Int'' 'Double''. Aucune conversion de ce type n'a lieu pour '(1/2) comme Double', les littéraux entiers sont simplement supposés être des doubles. Comparez https://stackoverflow.com/q/28813516/2976878 – Hamish

+2

Copie possible de [numéro de type Strange Swift] (https://stackoverflow.com/questions/28813516/strange-swift-numbers-type-casting) –

Répondre

4

1 et 2 sont des littéraux. Ils n'ont aucun type à moins que vous leur donniez un type de contexte.

let n6 = (1/2) as Double 

est essentiellement le même que

let n6: Double = 1/2 

cela signifie, vous dites au compilateur que le résultat est un Double. Cela signifie que les recherches du compilateur pour l'opérateur / avec un résultat Double, et cela signifie qu'il trouvera l'opérateur / sur deux opérandes Double et considère donc les deux littéraux comme de type Double.

D'autre part,

let n5 = Double(1/2) 

est un plâtre (ou mieux, l'initialisation d'un Double). Cela signifie que l'expression 1/2 est évaluée en premier, puis convertie en Double.

+2

' Double (1/2) 'n'est pas une distribution; le casting est fait avec 'as (! /?)';) – Hamish

+0

@Hamish Je sais mais la syntaxe est si proche des distributions statiques dans certaines langues que je ne m'en soucie pas trop :) – Sulthan

+0

'1 et 2 sont des littéraux. Ils n'ont pas de type sauf si vous leur donnez un type de contexte. »Je pensais que tous les littéraux entiers par défaut à« Int »si aucun type n'est fourni? – JAL