2017-08-03 51 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

相关问题