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

时间:2018-06-07 11:02:53

标签: swift operators

我试图在Swift playground

中初始化以下数组
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”然后我得到正确的输出,但我使用各种分数,理想情况下不希望必须全部输入。 有什么想法吗?

3 个答案:

答案 0 :(得分:4)

您的问题在于:1/36 1 36 都是Int。试试这个:

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

答案 1 :(得分:3)

由于整数除法,您似乎意识到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文字。

答案 2 :(得分:1)

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

您可以通过多种方式解决此问题:

  1. 使用浮点文字,推断为Double s:

    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. 使用1/36投放as Double

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

    在这种情况下,由于Swift知道除法的结果是Double,因此能够推断出136Double因为唯一产生Double的除法版本是指将两个Double作为输入的版本。

  4. 告诉Swift您正在创建[Double]

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

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

    在这种情况下,由于Swift知道数组包含Double,因此它能够推断1/36Double并且像#3那样推断出{{1} }和1也是36,因为导致Double的唯一版本的分段是将Double s作为输入的那个版本。