【问题标题】:Why does swift conversion work for floating point division?为什么快速转换适用于浮点除法?
【发布时间】:2017-08-03 16:35:02
【问题描述】:

与许多语言一样,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,然后它会尝试将其转换为 Double,从而有效地为您提供 0.0。

我很好奇为什么以下方法有效:

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

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

【问题讨论】:

标签: swift casting type-conversion division integer-division


【解决方案1】:

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

【讨论】:

  • Double(1 / 2) 不是演员表;铸造是用as(!/?) 完成的;)
  • @Hamish 我知道,但语法与某些语言中的静态转换非常接近,所以我不太担心:)
  • 1 and 2 are literals. They have no type unless you give them a type from context. 我认为如果没有提供类型,所有整数文字都默认为Int
  • @JAL 是,但as Double 为表达式提供了类型。
  • @JAL 我刚刚明白你的意思 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2015-03-20
相关资源
最近更新 更多