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/36
。 1 和 36 都是 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.0
和 36.0
都是 Double
文字。
正如其他答案所指出的,问题是 1
和 36
被推断为 Int
类型,因此 1/36
是使用整数除法执行的结果为 0
。然后将其传递给 Double()
,后者从 0
.
创建一个 Double
有多种方法可以解决此问题:
使用将被推断为 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)
将1
和36
之一或两者转换为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)
用 as Double
投射 1/36
:
var probabilitiesX = Array(repeating: 1/36 as Double, count: 36)
在这种情况下,由于Swift知道除法的结果是Double
,因此可以推断出1
和36
是[=25] =]s 因为唯一导致 Double
的除法版本是将两个 Double
s 作为输入的除法版本。
告诉 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 然后推断 1
和 36
也是 Double
,因为导致 Double
的除法的唯一版本是将两个 Double
作为输入.
我正在尝试在 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/36
。 1 和 36 都是 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.0
和 36.0
都是 Double
文字。
正如其他答案所指出的,问题是 1
和 36
被推断为 Int
类型,因此 1/36
是使用整数除法执行的结果为 0
。然后将其传递给 Double()
,后者从 0
.
Double
有多种方法可以解决此问题:
使用将被推断为
的浮点文字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)
将
1
和36
之一或两者转换为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)
用
as Double
投射1/36
:var probabilitiesX = Array(repeating: 1/36 as Double, count: 36)
在这种情况下,由于Swift知道除法的结果是
Double
,因此可以推断出1
和36
是[=25] =]s 因为唯一导致Double
的除法版本是将两个Double
s 作为输入的除法版本。告诉 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 然后推断1
和36
也是Double
,因为导致Double
的除法的唯一版本是将两个Double
作为输入.