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の両方をfloatにキャストする必要があるのか疑問に思っています。私はこのようにキャストしてみました:
return Float(sum/numbers.count)
しかしそれは私にちょうど3.0を与えます
まず、FloatではなくDoubleを使用する必要があります。フロートは非常に限られた精度を提供します。 Doubleで15桁の精度が必要なのに、Floatで6桁の精度が必要な理由は理解しにくいです。
第二に、コンパイラーはあなたが言うことを正確に実行します。
Float (sum) / Float (numbers.count)
整数「sum」を取り、整数「numbers.count」を取り、両方をFloatに変換して除算します。フロートの分割は、この場合3.5の結果をもたらします。
Float (sum/numbers.count)
整数「sum」を整数「numbers.count」で除算します。整数を除算すると、integerの結果が得られます。これは、余りを無視した整数の商です。 21/6は3に等しく、余りは3です。したがって、除算の結果は3になり、Float3.0に変換します。
return Float(sum/numbers.count)
このステートメントでは、sumとnumbers.countはどちらもIntであるため、Intを返すInt除算関数を使用します。 Intsには値全体しかないため、この結果では小数の精度が失われます。次に、このIntからFloatが作成され、10進数になりますが、この時点で精度はすでに失われています。
return Float(sum)/Float(numbers.count)
このステートメントでは、フロートはsumとnumbers.countから作成され、次に除算されます。今回はFloatであるため、Floatを返すFloatの除算関数を使用します。このステートメントでは、精度が失われることはないため、より正確な結果が返されます。
任意の整数の末尾に.0を追加して、次の操作を行うこともできます。
let red = CGFloat(226.0/255.0)
赤はCGFloat0.88627450980392152になります
この方法を使用して、RGBPhotoshopの色を隠します。
NSColor.init(calibratedRed: red, green: green, blue: blue, alpha: 1.0)
この場合、少なくともこれはうまく機能しますが、他の用途でも考えられます。