gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 13:08:40 24 4
gpt4 key购买 nike

我正在尝试使用以下代码获取 Int 数组的平均值:

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 或一般的编程数学有关),这与将总和除以长度得到 float/double 的事实有关,例如(1 + 2)/5 = 0.6 将在总和中向下舍入为 0。但是我希望 ((1 + 2) + 3)/5 = 1.2 返回 1,但它似乎也返回 0

对于 double ,无论采用哪种计算方式,计算都会按预期进行,只要我将计数整数装箱到 double 即可:

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 + 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 .

在第三种情况下, double 损失比整数小得多,你得到类似 (((((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))

关于swift - 为什么我不能在 Swift 的 reduce 中正确地划分整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32021017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com