我正在尝试使用以下代码获取Ints数组的平均值:
let numbers = [1,2,3,4,5]
let avg = numbers.reduce(0) { return $0 + $1 / numbers.count }
print(avg) // 1
这显然不正确。但是,如果我将除法移到闭包的外面:
let numbers = [1,2,3,4,5]
let avg = numbers.reduce(0) { return $0 + $1 } / numbers.count
print(avg) // 3
宾果!我想我记得在某处阅读(不记得是否与Swift,JavaScript或一般的编程数学有关),这与将总和除以长度的事实有关,例如: (1 + 2) / 5 = 0.6
将在0
的总和中向下舍入。但是我希望((1 + 2) + 3) / 5 = 1.2
返回1
,但它似乎也会返回0
。
使用双精度计算,只要我将计数整数加到双精度计算,计算就会按预期运行:
let numbers = [1.0,2.0,3.0,4.0,5.0]
let avg = numbers.reduce(0) { return $0 + $1 / Double(numbers.count) }
print(avg) // 3
我想我理解为什么(也许不是?)。但我无法想出一个可靠的例子来证明它。
非常感谢任何帮助和/或解释。感谢。
答案 0 :(得分:2)
该师不会产生双倍;你正在进行整数除法。
你没有得到((1 + 2) + 3 etc.) / 5
。
在第一种情况下,您将获得(((((0 + (1/5 = 0)) + (2/5 = 0)) + (3/5 = 0)) + (4/5 = 0)) + (5/5 = 1)) = 0 + 0 + 0 + 0 + 0 + 1 = 1
。
在第二种情况下,您将获得((((((0 + 1) + 2) + 3) + 4) + 5) / 5) = 15 / 5 = 3
。
在第三种情况下,双精度损失远小于整数,并得到类似(((((0 + (1/5.0 = 0.2)) + (2/5.0 = 0.4)) + (3/5.0 = 0.6)) + (4/5.0 = 0.8)) + (5/5.0 = 1.0))
的东西。