2017-08-03 91 views
1

像在許多語言中,斯威夫特的除法運算符默認爲整數除法,那麼:爲什麼快速轉換適用於浮點除法?

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

如果你想浮點除法,你所要做的

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 

同樣,像大多數其他語言,你無法投射整個操作:

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

發生這種情況的原因是swift執行整數除法1和2(1/2)並獲得0,然後它會嘗試投射到Double,實際上會給你0.0。

我很好奇,爲什麼以下工作:

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

我覺得這應該產生相同的結果Double(1/2)。爲什麼不呢?

+0

'雙(1/2)'是*不是*演員;它是從「Int」到「Double」的*轉換。 '(1/2)不會發生這種轉換,因爲整數文字只是推斷爲雙打。比較https://stackoverflow.com/q/28813516/2976878 – Hamish

+2

可能重複[奇怪的斯威夫特數字類型轉換](https://stackoverflow.com/questions/28813516/strange-swift-numbers-type-casting) –

回答

4

12是文字。除非你從上下文中給他們一個類型,否則他們沒有類型。

let n6 = (1/2) as Double 

是基本相同

let n6: Double = 1/2 

,這意味着,你告訴編譯器,這個結果是Double。這意味着編譯器使用Double結果搜索運算符/,這意味着它將在兩個Double操作數上找到運算符/,因此將這兩個文字都視爲類型Double

在另一方面,

let n5 = Double(1/2) 

爲鑄造(或更好說,一個Double的初始化)。這意味着首先評估1/2表達式,然後將其轉換爲Double

+2

'雙(1/2)'不是演員;鑄造是用'as(!/?)'完成的;) – Hamish

+0

@Hamish我知道,但是語法和一些語言中的靜態轉換非常接近,我並不擔心太多:) – Sulthan

+0

'1和2是文字。他們沒有類型,除非你給他們一個上下文的類型。「我認爲如果沒有提供類型,所有整數文字默認爲」Int「? – JAL