【发布时间】:2015-11-08 08:33:15
【问题描述】:
我正在尝试使用以下代码获取 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
我想我明白为什么(也许不是?)。但我想不出一个可靠的例子来证明这一点。
非常感谢任何帮助和/或解释。谢谢。
【问题讨论】:
-
int / int -> int: 类型必须被提升first才能进行浮点除法。
标签: swift math functional-programming reduce