Swift 除“/”运算符不起作用还是我错过了什么?

Is the Swift divide "/" operator not working or have I missed something?

我正在尝试在 Swift 游乐场

中初始化以下分数数组
var probabilitiesX = Array(repeating: Double(1/36), count: 36)

但我的输出数组是:

[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

基本上都是零。如果我输入小数形式的分数“0.02777777”,那么我会得到正确的输出,但是我使用的是各种分数,理想情况下我不想将它们全部输入。 有什么想法吗?

您的问题在这里:1/36136 都是 Int。试试这个:

var probabilitiesX = Array(repeating: 1.0 / 36.0, count: 36)

您似乎知道 1/36 由于整数除法而产生 0 这一事实。这可能就是为什么你写 Double(1/36) 来让 Swift 把 1/36 当作双数。

但是,Swift 计算表达式的顺序与您想象的不同。 Swift 将首先计算 1/36,然后计算 Double(0)

如果你想在你的代码中使用Double.init,你可以这样做:

Double(1)/Double(36)

现在,1 和 36 在 除法之前都被转换为双精度 。因此,不会发生整数除法。

事实上,你根本不需要Double,只需要:

1.0 / 36.0

1.036.0 都是 Double 文字。

正如其他答案所指出的,问题是 136 被推断为 Int 类型,因此 1/36 是使用整数除法执行的结果为 0。然后将其传递给 Double(),后者从 0.

创建一个 Double

有多种方法可以解决此问题:

  1. 使用将被推断为 Doubles:

    的浮点文字
    var probabilitiesX = Array(repeating: 1.0/36.0, count: 36)
    

    你可以只对其中一个使用浮点文字,因为 Swift 会推断另一个必须是 Double 才能除法工作:

    var probabilitiesX = Array(repeating: 1/36.0, count: 36)
    

    var probabilitiesX = Array(repeating: 1.0/36, count: 36)
    
  2. 136之一或两者转换为Double

    var probabilitiesX = Array(repeating: Double(1)/36, count: 36)
    

    var probabilitiesX = Array(repeating: 1/Double(36), count: 36)
    

    var probabilitiesX = Array(repeating: Double(1)/Double(36), count: 36)
    
  3. as Double 投射 1/36:

    var probabilitiesX = Array(repeating: 1/36 as Double, count: 36)
    

    在这种情况下,由于Swift知道除法的结果是Double,因此可以推断出136是[=25] =]s 因为唯一导致 Double 的除法版本是将两个 Doubles 作为输入的除法版本。

  4. 告诉 Swift 你正在创建一个 [Double]:

    var probabilitiesX = [Double](repeating: 1/36, count: 36)
    

    var probabilitiesX: [Double] = Array(repeating: 1/36, count: 36)
    

    在这种情况下,由于 Swift 知道数组包含 Double,因此可以推断出 1/36 是一个 Double 并且喜欢 #3 然后推断 136 也是 Double,因为导致 Double 的除法的唯一版本是将两个 Double 作为输入.