我试图在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”然后我得到正确的输出,但我使用各种分数,理想情况下不希望必须全部输入。 有什么想法吗?
答案 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.0
和36.0
都是Double
文字。
答案 2 :(得分:1)
正如其他答案所指出的那样,问题是1
和36
被推断为Int
类型,因此使用整数除法执行1/36
0
的结果。然后将其传递给Double()
,从Double
创建0
。
您可以通过多种方式解决此问题:
使用浮点文字,推断为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)
使用1/36
投放as Double
var probabilitiesX = Array(repeating: 1/36 as Double, count: 36)
在这种情况下,由于Swift知道除法的结果是Double
,因此能够推断出1
和36
是Double
因为唯一产生Double
的除法版本是指将两个Double
作为输入的版本。
告诉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} }和1
也是36
,因为导致Double
的唯一版本的分段是将Double
s作为输入的那个版本。