Swift中的浮动分割和铸造

时间:2014-08-06 00:44:03

标签: casting swift division

我试图学习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

3 个答案:

答案 0 :(得分:25)

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

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

Float (sum) / Float (numbers.count)

取整数“sum”,取整数“numbers.count”,将两者转换为Float并分割。 Floison Divison在这种情况下给出3.5的结果。

Float (sum/numbers.count)

将整数“sum”除以整数“numbers.count”。整数除法给出整数结果,这是一个整数商,忽略任何余数。 21/6等于3,余数为3.因此除法的结果为3,然后转换为Float 3.0。

答案 1 :(得分:2)

return Float(sum/numbers.count) 

在此语句中,sum和numbers.count都是Ints,因此它们使用返回Int的Int除法函数。由于Ints只有整数值,因此该结果会丢失任何小数精度。然后从这个Int创建一个Float,它有十进制数字,但此时精度已经丢失。

return Float(sum)/Float(numbers.count)

在本声明中,Floats由sum和numbers.count组成,然后分开。因为这次它们是Floats,所以使用Floats的除法函数返回Float。在此语句中,精度永远不会丢失,因此它会返回更准确的结果。

答案 2 :(得分: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)

至少在这种情况下这很好用,但我也会在其他用途​​中考虑。