我试图学习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
答案 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)
至少在这种情况下这很好用,但我也会在其他用途中考虑。