为什么swift转换适用于浮点除法?
与许多语言一样,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 同样,与大多数其他语言一样,您不能强制转换整个
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我刚刚意识到您的意思:)