为什么swift转换适用于浮点除法?

为什么swift转换适用于浮点除法?,swift,casting,type-conversion,division,integer-division,Swift,Casting,Type Conversion,Division,Integer Division,与许多语言一样,Swift的除法运算符默认为整数除法,因此: 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 同样,与大多数其他语言一样,您不能强制转换整个

与许多语言一样,Swift的除法运算符默认为整数除法,因此:

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,然后它尝试将其转换为
双精度
,实际上得到0.0

我很想知道为什么以下方法有效:

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

我觉得这应该会产生与
Double(1/2)
相同的结果。为什么不呢?

1
2
都是文字。除非您从上下文中为它们指定类型,否则它们没有类型

let n6 = (1 / 2) as Double
本质上与

let n6: Double = 1 / 2
这意味着,您告诉编译器结果是一个
Double
。这意味着编译器搜索带有
双精度
结果的运算符
/
,这意味着它将在两个
双精度
操作数上找到运算符
/
,因此将两个文本视为
双精度
类型

另一方面,

let n5 = Double(1 / 2)

是一个强制转换(或者更确切地说,是一个双精度的初始化)。这意味着表达式
1/2
首先求值,然后转换为
Double

Double(1/2)
不是强制转换;它是从
Int
Double
的转换。如果将
(1/2)转换为Double,则不会发生这种转换,整数文本将被简单地推断为Double。比较可能重复的
双(1/2)
不是强制转换;使用
as(!/?)
;)完成铸造@Hamish我知道,但在某些语言中,语法非常接近静态强制转换,因此我不太担心:)
1和2是文本。除非您从上下文中为它们指定类型,否则它们没有类型。
如果没有提供类型,我认为所有整数文本都默认为
Int
。@JAL是的,但是
as Double
为表达式提供了类型。@JAL我刚刚意识到您的意思:)