Swift'te Float'ı Int'ye Dönüştür


199

Ben dönüştürmek istediğiniz Floatbir etmek IntSwift. Bunun gibi temel döküm işe yaramaz çünkü Objective-C'deki floats ve ints'den farklı olarak bu türler ilkel değildir

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

Ancak bu aşağıdaki hata iletisini üretir:

'Float', 'Int'ye dönüştürülemez

Bir fikrin nasıl mülk dönüştürün Floatiçin Int?


2
asOperatör alt sınıfları için aşağı-döküm içindir. yani:UIView as UIButton
Jack

2
hızlı bir şekilde, as anahtar sözcüğünü kullanarak veya 4 gibi? Dize, 4 bir dize olabilirse çalışır, ancak çalışmazsa çalışmaz. Bunu gündeme getiriyorum çünkü sorunuzda "döküm" kelimesini kullanıyorsunuz ve kafanızın karışmasını istemedim. : 3
Aaa Dickens

Kodunuz mantıklı değil. (Float olarak float) hiçbir şey yapmaz çünkü float zaten Float tipindedir. Var tamsayı: Int = float (aynı hata) ya da var tamsayı: Int = int olarak float.
gnasher729

Yanıtlar:


318

Sen dönüştürebilirsiniz Floatiçin Intböyle Swift:

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

Bu sonucu @ paulm'un yorumuyla da elde edebilirsiniz:

var myIntValue = Int(myFloatValue)

@paulm - Denememiştim (yorumdaki kodun üstünde) . ama bizim için işe yarayabilir (emin değilim) .
iPatel

4
Oyuncular, Swift derleyicisinin değişken türünü sezmesi için yeterlidir, bu nedenle türü açıkça bildirmeniz gerekmez. var myIntValue = Int(myFloatValue)İşler.
Tim Sullivan

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

116

Açık Dönüşüm

Int'ye dönüştürmek hassasiyeti kaybeder (etkili şekilde aşağı yuvarlanır). Matematik kitaplıklarına erişerek açık dönüşümler gerçekleştirebilirsiniz. Örneğin:

Eğer istersen yuvarlak aşağı ve tamsayıya dönüştürmek:

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

sonuç 10'dur.

Eğer yuvarlamak istiyorsan ve tamsayıya dönüştürmek:

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

sonuç 11'dir.

Açıkça en yakın tam sayıya yuvarlamak istiyorsanız

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

sonuç 11'dir.

İkinci durumda, bu bilgiçliksel görünebilir, ancak örtük bir dönüşüm olmadığı için anlamsal olarak daha açıktır ... örneğin sinyal işleme yapıyorsanız önemli.


3
Evet, Int () basitçe kesirli kısmı kesiyor, ki bu genellikle istenen davranış değil;) Int (round (f)) işi yapar.
Grzegorz D.

1
Ya da değeri yukarı yuvarlamak için tavana () basın.
Vincent

Kenar durumu:round(10.5) == 11.0
itMaxence

let y = Int(round(f))ayrıca şu şekilde de yazılabilirlet y = lround(f)
S1LENT WARRIOR

26

Dönüştürmek basit:

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

Ama güvenli değil:

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

Güzel bir çökme nedeniyle olacak:

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

Bu yüzden taşma işleyen bir uzantı oluşturdum:

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

Umarım bu birine yardımcı olabilir


26

Sayıyı hassas bir şekilde yuvarlamanın birçok yolu vardır. Sonunda swift'in standart kütüphane yöntemini kullanmalısınızrounded() float numarasını istenilen hassasiyetle yuvarlamak için swift'in kullanmalısınız.

Yuvarlamak için.up kural kullanın :

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

Yuvarlak için aşağı kullanım .downkuralı:

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

En yakın tam sayı kullanım .toNearestOrEvenkuralına yuvarlamak için :

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

Aşağıdaki örneğe dikkat edin:

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

5

Bunun gibi:

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

Şamandırayı Tamsayı başlatma yöntemine geçirerek şamandıranızın tamsayı temsilini alabilirsiniz.

Misal:

Int(myFloat)

Ondalık noktadan sonraki tüm sayıların kayıp olacağını unutmayın. Yani, 3.9 bir Int 3 ve 8.99999 8 bir tamsayıdır.


7
Ve yuvarlama için Int (MyFloat + .5) kullanın.
Jean Le Moignan

4

Bir işlev stili dönüşümü kullanın (" Hızlı Programlama Dili " nden "Tamsayı ve Kayan Nokta Dönüştürme" etiketli bölümde bulunur [iTunes bağlantısı])

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

1

Bu şekilde döküm yazabilirsiniz:

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

1

Sadece dökümünü kullanın

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

 println("IntegerValue = \(integerValue)")

yuvarlama değerini gösterecektir, örneğin: IntegerValue = 5 ondalık noktasının kayıp olacağı anlamına gelir



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

Bu, float-Int


0

Kayan değeri kaydettiğinizi "X"ve içinde tamsayı değeri sakladığınızı varsayalım "Y".

Var Y = Int(x);

veya

var myIntValue = Int(myFloatValue)

-1

Yerine Int64kullanın Int. Int64büyük int değerlerini saklayabilir.


orijinal soru için mi yoksa Floatdeğer aralığından daha büyük bir değer aralığına Intmı sahip olduğunuz için ?
benc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.