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?

kev
sumber
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)
iPatel
sumber
@ 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.

pengguna3675131
sumber
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

Artyom Razinov
sumber
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
Borut Tomazin
sumber
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
Logan
sumber
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.

A'sa Dickens
sumber
7
Dan gunakan Int (MyFloat + .5) untuk pembulatan.
Jean Le Moignan
4

Gunakan konversi gaya fungsi (ditemukan di bagian berlabel "Integer dan Floating-Point Conversion" dari " The Swift Programming Language. " [Tautan iTunes])

  1> Int(3.4)
$R1: Int = 3
cobbal
sumber
1

Anda dapat mengetikkan cor seperti ini:

 var float:Float = 2.2
 var integer:Int = Int(float)
CNU
sumber
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

pravin salame
sumber
0
var i = 1 as Int

var cgf = CGFLoat(i)
Kaledonia
sumber
0
var floatValue = 10.23
var intValue = Int(floatValue)

Ini cukup untuk mengkonversi dari floatmenjadiInt

Daya Kevin
sumber
0

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

Var Y = Int(x);

atau

var myIntValue = Int(myFloatValue)
Shashikant Kashodhan
sumber
-1

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

Aspen
sumber
maksud Anda, untuk pertanyaan awal, atau untuk masalah Floatmemiliki rentang nilai yang lebih besar dari Int?
benc