在斯威夫特浮动分裂和铸造

Tom*_*ero 13 casting division swift

我正在尝试学习Swift,我做了一个简单的平均函数:

func average(numbers: Int...) -> Float {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return Float(sum)/Float(numbers.count)
}
average(1,2,3,4,5,6)
Run Code Online (Sandbox Code Playgroud)

这给了我正确的结果:3.5但是,我想知道为什么我必须将sum和numbers.count转换为浮点数.我尝试过这种方式:

return Float(sum/numbers.count)
Run Code Online (Sandbox Code Playgroud)

但它给了我3.0

gna*_*729 30

首先,你应该使用Double而不是Float.Float为您提供非常有限的精度.为什么你会想要使用Float的6位数精度当你有15位数时使用Double很难理解.

其次,编译器完全按照您的说法执行操作.

Float (sum) / Float (numbers.count)
Run Code Online (Sandbox Code Playgroud)

取整数"sum",取整数"numbers.count",将两者都转换为Float并进行除法.Floison Divison在这种情况下给出3.5的结果.

Float (sum/numbers.count)
Run Code Online (Sandbox Code Playgroud)

将整数"sum"除以整数"numbers.count".整数除法给出一个整数结果,它是一个整数商,不考虑任何余数.21/6等于3,余数为3.因此除法的结果为3,然后转换为Float 3.0.

  • 给初学者的提示:有时 64 位双精度值是多余的。如果 6 位精度足够(例如百分比进度条计算),则 32 位浮点数就可以了。当 4 个字节已经过大时,使用 8 个字节,尤其是在 iPhone 和 iWatch 等可穿戴设备上,并不是可用资源的最佳利用方式。 (2认同)