Ubah Float ke Int dalam Swift


199

Saya ingin mengonversi Floatke Intdalam Swift. Pengecoran dasar seperti ini tidak berfungsi karena tipe ini bukan primitif, tidak seperti floats dan ints di Objective-C

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

Tetapi ini menghasilkan pesan kesalahan berikut:

'Float' tidak dapat dikonversi menjadi 'Int'

Adakah yang tahu cara konversi properti dari Floatmenjadi Int?


2
yang asoperator adalah untuk turun-casting untuk subclass. yaitu:UIView as UIButton
Jack

2
di swift, Anda bisa melakukan casting dengan menggunakan kata kunci as atau opsional as (as?) seperti 4 as? String, jika 4 dapat berupa string, maka akan berfungsi tetapi jika tidak maka tidak akan berfungsi. Saya membahas ini karena Anda menggunakan kata "casting" dalam pertanyaan Anda dan saya tidak ingin Anda bingung. : 3
A'sa Dickens

Kode Anda tidak masuk akal. (float as Float) tidak melakukan apa-apa karena float sudah dari tipe Float. Anda bisa berarti var integer: Int = float (kesalahan yang sama) atau var integer: Int = float as Int.
gnasher729

Jawaban:


318

Anda dapat mengonversi Floatke Intdalam Swift seperti ini:

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

Anda juga dapat mencapai hasil ini dengan komentar @ paulm:

var myIntValue = Int(myFloatValue)

@ paulm - Saya belum mencoba (kode di atas dalam komentar) . tapi mungkin itu akan bekerja untuk kita (tidak yakin) .
iPatel

4
Pemain cukup untuk kompiler Swift untuk intuisi tipe variabel, jadi Anda tidak perlu mendeklarasikan tipe secara eksplisit. var myIntValue = Int(myFloatValue)bekerja.
Tim Sullivan

(cepat 2.0) lebih baik untuk memeriksa apakah nilai float adalah nilai yang terbatas, jika myFloatvalue.isFinite {...}
ZYiOS

116

Konversi Eksplisit

Konversi ke Int akan kehilangan presisi apa pun (pembulatan efektif). Dengan mengakses perpustakaan matematika Anda dapat melakukan konversi eksplisit. Sebagai contoh:

Jika Anda ingin membulatkan dan mengkonversi ke integer:

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

hasilnya adalah 10.

Jika Anda ingin mengumpulkan dan mengubahnya menjadi integer:

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

hasilnya 11.

Jika Anda ingin membulatkan secara eksplisit ke bilangan bulat terdekat

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

hasilnya 11.

Dalam kasus yang terakhir, ini mungkin terlihat sangat bagus, tetapi secara semantik lebih jelas karena tidak ada konversi tersirat ... penting jika Anda melakukan pemrosesan sinyal misalnya.


3
Ya, itu benar-benar layak dicatat bahwa Int () hanya memotong bagian fraksional, yang biasanya bukan perilaku yang diinginkan;) Int (putaran (f)) melakukan pekerjaan.
Grzegorz D.

1
Atau ceil () untuk membulatkan nilai ke atas.
Vincent

Edge case:round(10.5) == 11.0
itMaxence

26

Konversi itu sederhana:

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

Tapi itu tidak aman:

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

Akan karena kecelakaan yang bagus:

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

Jadi saya telah membuat ekstensi yang menangani overflow:

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
        }
    }
}

Saya harap ini bisa membantu seseorang


26

Ada banyak cara untuk membulatkan angka dengan presisi. Anda akhirnya harus menggunakan metode perpustakaan standar swift rounded()untuk membulatkan angka float dengan presisi yang diinginkan.

Untuk putaran up penggunaan .upaturan:

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

Untuk putaran bawah penggunaan .downaturan:

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

Untuk membulatkan ke aturan penggunaan integer terdekat.toNearestOrEven :

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

Waspadai contoh berikut:

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

5

Seperti ini:

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

Anda bisa mendapatkan representasi integer float Anda dengan meneruskan float ke metode initializer Integer.

Contoh:

Int(myFloat)

Perlu diingat, bahwa angka apa pun setelah titik desimal akan hilang. Artinya, 3,9 adalah Int dari 3 dan 8,99999 adalah bilangan bulat dari 8.


7
Dan gunakan Int (MyFloat + .5) untuk pembulatan.
Jean Le Moignan


1

Anda dapat mengetikkan cor seperti ini:

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

1

Cukup gunakan tipe casting

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

 println("IntegerValue = \(integerValue)")

itu akan menunjukkan nilai pembulatan misalnya: IntegerValue = 5 berarti titik desimal akan hilang



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

Ini cukup untuk mengkonversi dari floatmenjadiInt


0

Misalkan Anda menyimpan nilai float "X"dan Anda menyimpan nilai integer di "Y".

Var Y = Int(x);

atau

var myIntValue = Int(myFloatValue)

-1

Gunakan Int64sebagai ganti Int. Int64dapat menyimpan nilai int yang besar.


maksud Anda, untuk pertanyaan awal, atau untuk masalah Floatmemiliki rentang nilai yang lebih besar dari Int?
benc
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.