使用Swift 4大步走有时会导致错误的结果,这段代码说明了这一点:
let demo = Demo()
let nbrOfElements = demo.omegaArray.count
let lastElement = demo.omegaArray[nbrOfElements-1]
print("\(nbrOfElements)") // -> 1000
print("\(lastElement)") // -> 9.990000000000002
变量dOmega的值应为0.001。 该数组的大小预计为1001个元素, 最后一个元素的值应为10.0
但是,这些假设是不正确的,如下面的代码部分所示:
print("\(demo.dOmega)") // -> 0.010000000000000002
那里发生了什么?检查dOmega会给出答案。
entities
增量值dOmega并不完全符合预期的0.01,但是具有非常小的近似误差,对于Double来说是可以的。但是,这导致了这样的情况,预期的Array元素1001的值将为10.000000000000002,该值大于给定的最大值10.0,因此不会生成此元素1001。 根据跨步函数中的变量是否具有舍入错误,结果是否为预期的结果。
我的问题是:在Doubles中使用大步走来获得预期结果的正确方法是什么?
答案 0 :(得分:0)
您使用了错误的stride
重载!
有两个重载:
您应该使用第二个参数,因为它包含参数through
,而第一个参数不包含参数to
。
print(Array(stride(from: 0, through: 10.0, by: 0.001)).last!) // 10.0
您看到的微小差异仅仅是因为imprecise nature of Double
。