Swift中的浮点数除法和类型转换

20

我正在尝试学习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)

这样可以得到正确的结果:3.5 然而,我想知道为什么我必须将sum和numbers.count都转换为浮点数。我试着这样转换:

return Float(sum/numbers.count)

但它只给了我3.0


我想我们一直在读同一本书... =D - Kid Diamond
3个回答

42

首先,你应该使用Double而不是Float。 Float给您非常有限的精度。为什么您希望使用Float获得6位数字精度,而使用Double可以获得15位数字,这很难理解。

其次,编译器会按照您的指示执行操作。

Float (sum) / Float (numbers.count)

取整数"sum",取整数"numbers.count",将两个整数转换为浮点数并进行除法运算。在本例中,浮点数除法的结果为3.5。

Float (sum/numbers.count)

将整数"sum"除以整数"numbers.count"。整数除法会得到一个整数结果,即忽略余数的商。21 / 6 等于 商3 余3。因此,除法的结果是3,您需要将其转换为浮点数3.0。


3
初学者提示:有时64位双精度浮点数过于复杂。如果只需要6位数字的精度,例如计算百分比进度条等情况,那么32位单精度浮点数就足够了。在可用资源已经过载的情况下,使用8字节而不是4字节,尤其是在像iPhone和iWatch这样的可穿戴设备上,不是最佳选择。 - Austen Hoogen

3
return Float(sum/numbers.count) 

在这个语句中,sum和numbers.count都是Int类型,所以它们使用了一个Int类型的除法函数,该函数返回一个Int类型。由于Int类型只有整数值,因此这个结果失去了任何小数精度。然后从这个Int创建了一个Float类型,它具有小数位,但此时精度已经丢失了。
return Float(sum)/Float(numbers.count)

在这个语句中,通过对 sum 和 numbers.count 进行求和再相除的方式创建了 Floats。由于这些值现在是 Floats 类型,因此使用了针对 Floats 的除法函数,该函数返回一个 Float 值。在这个语句中没有丢失精度,因此它返回了一个更准确的结果。

0

你也可以在任何整数末尾加上 .0 进行操作:

let red = CGFloat(226.0/255.0)

红色将是CGFloat 0.88627450980392152

我使用这种方法来转换RGB Photoshop颜色:

NSColor.init(calibratedRed: red, green: green, blue: blue, alpha: 1.0)

至少在这种情况下,它能够很好地工作,但我认为在其他用途中也同样适用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接