Zamień Float na Int w Swift

198

Chcę przekonwertować A Floatna IntSwift. Podstawowe odlew jak to nie działa, ponieważ te typy nie są prymitywy, w przeciwieństwie floats i ints w Objective-C

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

Ale powoduje to następujący komunikat o błędzie:

„Float” nie jest konwertowany na „Int”

Masz pomysł, jak przekonwertować właściwość z Floatna Int?

kev
źródło
2
asoperator jest w dół do odlewania na podklasy. tj .:UIView as UIButton
Jack
2
w trybie szybkim możesz wykonywać rzutowanie za pomocą słowa kluczowego as lub opcjonalnie jako (as?), np. 4 as? Łańcuch, jeśli 4 może być łańcuchem, zadziała, ale jeśli nie, nie będzie działać. Mówię o tym, ponieważ w swoim pytaniu używasz słowa „casting” i nie chciałem, żebyś się mylił. : 3
A'sa Dickens,
Twój kod nie ma sensu. (float jako Float) nic nie robi, ponieważ float jest już typu Float. Miałeś na myśli var integer: Int = float (ten sam błąd) lub var integer: Int = float jako Int.
gnasher729

Odpowiedzi:

317

Możesz przekonwertować Floatna IntSwift w następujący sposób:

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

Możesz również osiągnąć ten wynik za pomocą komentarza @ paulm:

var myIntValue = Int(myFloatValue)
iPatel
źródło
@paulm - nie próbowałem (powyżej kodu w komentarzu) . ale być może zadziała dla nas (nie jestem pewien) .
iPatel
4
Rzutowanie wystarcza, aby kompilator Swift intuicyjnie typ zmiennej, więc nie trzeba jawnie deklarować typu. var myIntValue = Int(myFloatValue)Pracuje.
Tim Sullivan
(szybki 2.0) lepiej sprawdzić, czy wartość zmiennoprzecinkowa jest wartością skończoną, jeśli myFloatvalue.isFinite {...}
ZYiOS
116

Jawna konwersja

Konwersja na Int spowoduje utratę dowolnej precyzji (skuteczne zaokrąglanie w dół). Uzyskując dostęp do bibliotek matematycznych, możesz wykonywać jawne konwersje. Na przykład:

Jeśli chcesz zaokrąglić w dół i przekonwertować na liczbę całkowitą:

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

wynik to 10.

Jeśli chcesz zaokrąglić w górę i przekonwertować na liczbę całkowitą:

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

wynik to 11.

Jeśli chcesz jawnie zaokrąglić do najbliższej liczby całkowitej

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

wynik to 11.

W tym drugim przypadku może się to wydawać pedantyczne, ale jest semantycznie wyraźniejsze, ponieważ nie ma niejawnej konwersji ... ważne, jeśli wykonujesz na przykład przetwarzanie sygnału.

użytkownik3675131
źródło
3
Tak, naprawdę warto zauważyć, że Int () po prostu przecina część ułamkową, co zwykle nie jest pożądanym zachowaniem;) Int (round (f)) wykonuje pracę.
Grzegorz D.
1
Lub Ceil (), aby zaokrąglić wartość w górę.
Vincent
Edge case:round(10.5) == 11.0
itMaxence
26

Konwersja jest prosta:

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

Ale to nie jest bezpieczne:

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

Will z powodu miłej awarii:

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

Więc stworzyłem rozszerzenie, które obsługuje przepełnienie:

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

Mam nadzieję, że to może komuś pomóc

Artem Razinow
źródło
26

Istnieje wiele sposobów na precyzyjne zaokrąglanie liczb. W końcu powinieneś użyć standardowej metody bibliotecznej swift, rounded()aby zaokrąglić liczbę zmiennoprzecinkową z pożądaną precyzją.

Aby zaokrąglić w górę, użyj .upreguły:

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

Aby zaokrąglić w dół.down regułę użycia :

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

Aby zaokrąglić do najbliższej.toNearestOrEven reguły użycia :

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

Pamiętaj o następującym przykładzie:

let f: Float = 2.5
let i = Int(roundf(f)) // 3
let j = Int(f.rounded(.toNearestOrEven)) // 2
Borut Tomazin
źródło
5

Lubię to:

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
źródło
5

Możesz uzyskać całkowitą reprezentację liczby zmiennoprzecinkowej, przekazując wartość zmiennoprzecinkową do metody inicjalizacji liczby całkowitej.

Przykład:

Int(myFloat)

Pamiętaj, że wszelkie liczby po przecinku będą stratą. Oznacza to, że 3,9 to liczba całkowita 3, a 8,99999 to liczba całkowita 8.

A'sa Dickens
źródło
7
I użyj Int (MyFloat + .5) do zaokrąglania.
Jean Le Moignan,
4

Użyj konwersji stylu funkcji (znalezionej w sekcji „Konwersja liczb całkowitych i zmiennoprzecinkowych” z „ The Swift Programming Language. [ITunes link])

  1> Int(3.4)
$R1: Int = 3
cobbal
źródło
1

Możesz wpisać cast w następujący sposób:

 var float:Float = 2.2
 var integer:Int = Int(float)
CNU
źródło
1

Wystarczy użyć rzutowania typu

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

 println("IntegerValue = \(integerValue)")

wyświetli wartość zaokrąglenia, np .: IntegerValue = 5 oznacza, że ​​przecinek dziesiętny będzie stratą

pravin salame
źródło
0
var i = 1 as Int

var cgf = CGFLoat(i)
Kaledonia
źródło
0
var floatValue = 10.23
var intValue = Int(floatValue)

To wystarczy, aby przekonwertować z floatnaInt

Daya Kevin
źródło
0

Załóżmy, że przechowujesz wartość zmiennoprzecinkową w "X"i zapisujesz wartość całkowitą w "Y".

Var Y = Int(x);

lub

var myIntValue = Int(myFloatValue)
Shashikant Kashodhan
źródło
-1

Użyj Int64zamiast Int. Int64może przechowywać duże wartości int.

Osika
źródło
masz na myśli pytanie oryginalne lub problem z Floatzakresem wartości większym niż Int?
benc