SwiftでFloatをIntに変換する


199

Swiftでa Floatをに変換したいInt。Objective-Cのfloatsとは異なり、これらのタイプはプリミティブではないため、このような基本的なキャストは機能しません。int

var float: Float = 2.2
var integer: Int = float as Float

ただし、次のエラーメッセージが表示されます。

「Float」は「Int」に変換できません

プロパティをどのように変換FloatするのIntですか?


2
asオペレータは、サブクラスへのダウンキャストのためです。例:UIView as UIButton
ジャック

2
すばやく、asキーワードまたはオプションのas(as?)を使用して型キャストを実行できます(4 as?など)。文字列、4を文字列にできる場合は機能しますが、そうでない場合は機能しません。質問で「キャスティング」という言葉を使用していて、混乱させたくなかったので、これを取り上げます。:3
アサディケンズ2014

あなたのコードは意味がありません。(float as Float)は、floatがすでにFloat型であるため、何もしません。var integer:Int = float(同じエラー)またはvar integer:Int = float as Intを意味しました。
gnasher729

回答:


318

あなたはこのようにSwiftで変換FloatすることができますInt

var myIntValue:Int = Int(myFloatValue)
println "My value is \(myIntValue)"

@paulmのコメントでこの結果を達成することもできます。

var myIntValue = Int(myFloatValue)

@paulm-私は試していませんでした(上記のコメントのコード)。しかし、それは私たちにとってはうまくいくかもしれません(確かではありません)
iPatel 2014

4
キャストは、Swiftコンパイラーが変数の型を初期化するのに十分であるため、型を明示的に宣言する必要はありません。var myIntValue = Int(myFloatValue)動作します。
Tim Sullivan

(swift 2.0)myFloatvalue.isFinite {...}
ZYiOS

116

明示的な変換

Intに変換すると、精度が失われます(実質的に切り捨てられます)。数学ライブラリにアクセスすることで、明示的な変換を実行できます。例えば:

あなたはしたい場合は、ラウンドダウンして整数に変換します。

let f = 10.51
let y = Int(floor(f))

結果は10です。

切り上げて整数に変換したい場合:

let f = 10.51
let y = Int(ceil(f))

結果は11です。

最も近い整数明示的に 丸めたい場合

let f = 10.51
let y = Int(round(f))

結果は11です。

後者の場合、これは不自然に見えるかもしれませんが、暗黙的な変換がないため、意味的には明確です...たとえば、信号処理を行う場合は重要です。


3
ええ、Int()が小数部分を単にカットすることは本当に注目に値します。通常、これは望ましい動作ではありません;)Int(round(f))が機能します。
Grzegorz D.

1
またはceil()で値を丸めます。
Vincent

エッジケース:round(10.5) == 11.0
itMaxence 2018

26

変換は簡単です:

let float = Float(1.1) // 1.1
let int = Int(float) // 1

しかし、それは安全ではありません:

let float = Float(Int.max) + 1
let int = Int(float)

素敵なクラッシュが原因でしょう:

fatal error: floating point value can not be converted to Int because it is greater than Int.max

だから私はオーバーフローを処理する拡張機能を作成しました:

extension Double {
    // If you don't want your code crash on each overflow, use this function that operates on optionals
    // E.g.: Int(Double(Int.max) + 1) will crash:
    // fatal error: floating point value can not be converted to Int because it is greater than Int.max
    func toInt() -> Int? {
        if self > Double(Int.min) && self < Double(Int.max) {
            return Int(self)
        } else {
            return nil
        }
    }
}


extension Float {
    func toInt() -> Int? {
        if self > Float(Int.min) && self < Float(Int.max) {
            return Int(self)
        } else {
            return nil
        }
    }
}

これが誰かを助けることを願っています


26

数値を正確に丸める方法はたくさんあります。最終的には、Swiftの標準ライブラリメソッドrounded()を使用して、浮動小数点数を必要な精度で丸める必要があります。

ラウンドへのアップの使用.upルール:

let f: Float = 2.2
let i = Int(f.rounded(.up)) // 3

ラウンドにダウンを使用し.downたルール:

let f: Float = 2.2
let i = Int(f.rounded(.down)) // 2

最も近い整数に丸めるには、次の.toNearestOrEvenルールを使用します。

let f: Float = 2.2
let i = Int(f.rounded(.toNearestOrEven)) // 2

次の例に注意してください。

let f: Float = 2.5
let i = Int(roundf(f)) // 3
let j = Int(f.rounded(.toNearestOrEven)) // 2

5

このような:

var float:Float = 2.2 // 2.2
var integer:Int = Int(float) // 2 .. will always round down.  3.9 will be 3
var anotherFloat: Float = Float(integer) // 2.0

5

floatをInteger初期化メソッドに渡すことにより、floatの整数表現を取得できます。

例:

Int(myFloat)

小数点以下の数値はすべて失われることに注意してください。つまり、3.9は3のIntで、8.99999は8の整数です。


7
丸めにはInt(MyFloat + .5)を使用します。
Jean Le Moignan 14年


1

次のようにキャストを入力できます。

 var float:Float = 2.2
 var integer:Int = Int(float)

1

型キャストを使用するだけ

 var floatValue:Float = 5.4
 var integerValue:Int = Int(floatValue)

 println("IntegerValue = \(integerValue)")

丸め値が表示されます。例:IntegerValue = 5は、小数点が失われることを意味します



0
var floatValue = 10.23
var intValue = Int(floatValue)

これはから変換するのに十分ですfloatInt



-1

Int64代わりに使用しますIntInt64大きなint値を格納できます。


つまり、元の質問、またはFloatより大きい値の範囲の問題についてIntですか?
benc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.