雨燕与双打大步前进并不可靠

时间:2019-02-16 09:56:23

标签: swift stride

使用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中使用大步走来获得预期结果的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

您使用了错误的stride重载!

有两个重载:

您应该使用第二个参数,因为它包含参数through,而第一个参数不包含参数to

print(Array(stride(from: 0, through: 10.0, by: 0.001)).last!) // 10.0

您看到的微小差异仅仅是因为imprecise nature of Double