为什么我不能在Swift中的reduce中正确地划分整数?

时间:2015-08-15 02:47:50

标签: swift math functional-programming reduce

我正在尝试使用以下代码获取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

我想我理解为什么(也许不是?)。但我无法想出一个可靠的例子来证明它。

非常感谢任何帮助和/或解释。感谢。

1 个答案:

答案 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))的东西。