web-dev-qa-db-ja.com

フロート除算とキャストイン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)

これで正しい結果が得られます。3.5しかし、なぜsumとnumbers.countの両方をfloatにキャストする必要があるのか​​疑問に思っています。私はこのようにキャストしてみました:

return Float(sum/numbers.count)

しかしそれは私にちょうど3.0を与えます

13
Tomasero

まず、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に変換します。

30
gnasher729
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の除算関数を使用します。このステートメントでは、精度が失われることはないため、より正確な結果が返されます。

2
Connor

任意の整数の末尾に.0を追加して、次の操作を行うこともできます。

let red = CGFloat(226.0/255.0)

赤はCGFloat0.88627450980392152になります

この方法を使用して、RGBPhotoshopの色を隠します。

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

この場合、少なくともこれはうまく機能しますが、他の用途でも考えられます。

0
Neal Davis