Konvertieren Sie Float in Swift in Int

198

Ich möchte ein Floatin ein Intin Swift konvertieren . Grundlegendes Casting wie dieses funktioniert nicht, da diese Typen im Gegensatz zu floats und ints in Objective-C keine Grundelemente sind

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

Dies erzeugt jedoch die folgende Fehlermeldung:

'Float' kann nicht in 'Int' konvertiert werden

Irgendeine Idee, wie man Immobilien von Floatnach konvertiert Int?

kev
quelle
2
Der asBediener ist für das Herunterwerfen in Unterklassen vorgesehen. dh:UIView as UIButton
Jack
2
In Swift können Sie das Casting mit dem Schlüsselwort as oder optional mit (as?) wie 4 as? String, wenn 4 ein String sein kann, funktioniert es, aber wenn es nicht ist, funktioniert es nicht. Ich spreche das an, weil Sie in Ihrer Frage das Wort "Casting" verwenden und ich wollte nicht, dass Sie verwirrt sind. : 3
A'sa Dickens
Ihr Code macht keinen Sinn. (float as Float) macht nichts, da float bereits vom Typ Float ist. Sie meinten entweder var integer: Int = float (gleicher Fehler) oder var integer: Int = float als Int.
Gnasher729

Antworten:

317

Sie können konvertieren Floatzu , Intwie dies in Swift:

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

Sie können dieses Ergebnis auch mit dem Kommentar von @ paulm erzielen:

var myIntValue = Int(myFloatValue)
iPatel
quelle
@paulm - Ich hatte es nicht versucht (über Code im Kommentar) . aber vielleicht funktioniert es bei uns (nicht sicher) .
iPatel
4
Die Umwandlung reicht aus, damit der Swift-Compiler den Variablentyp intuitiv erkennt, sodass Sie den Typ nicht explizit deklarieren müssen. var myIntValue = Int(myFloatValue)funktioniert.
Tim Sullivan
(Swift 2.0) Es ist besser zu überprüfen, ob der Float-Wert ein endlicher Wert ist, wenn myFloatvalue.isFinite {...}
ZYiOS
116

Explizite Konvertierung

Die Konvertierung in Int verliert an Präzision (effektive Abrundung). Durch den Zugriff auf die Mathematikbibliotheken können Sie explizite Konvertierungen durchführen. Beispielsweise:

Wenn man will abrunden und konvertiert integer:

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

Ergebnis ist 10.

Wenn Sie wollte aufrunden zu integer und konvertieren:

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

Ergebnis ist 11.

Wenn Sie explizit auf die nächste Ganzzahl runden möchten

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

Ergebnis ist 11.

Im letzteren Fall mag dies pedantisch erscheinen, aber es ist semantisch klarer, da es keine implizite Konvertierung gibt ... wichtig, wenn Sie beispielsweise eine Signalverarbeitung durchführen.

user3675131
quelle
3
Ja, es ist wirklich erwähnenswert, dass Int () einfach den Bruchteil schneidet, was normalerweise nicht das gewünschte Verhalten ist;) Int (Runde (f)) erledigt den Job.
Grzegorz D.
1
Oder decken Sie () ab, um den Wert nach oben zu runden.
Vincent
round(10.5) == 11.0
Randfall
26

Das Konvertieren ist einfach:

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

Aber es ist nicht sicher:

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

Will wegen eines schönen Absturzes:

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

Also habe ich eine Erweiterung erstellt, die den Überlauf behandelt:

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

Ich hoffe das kann jemandem helfen

Artyom Razinov
quelle
26

Es gibt viele Möglichkeiten, Zahlen präzise zu runden. Sie sollten eventuell die Standardbibliotheksmethode von swift verwenden rounded(), um die Gleitkommazahl mit der gewünschten Genauigkeit zu runden.

Um rund up Verwendung .upRegel:

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

Um abzurunden , verwenden Sie die .downRegel:

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

Um auf die nächste Ganzzahl zu runden, verwenden Sie die .toNearestOrEvenRegel:

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

Beachten Sie das folgende Beispiel:

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

So was:

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
quelle
5

Sie können eine ganzzahlige Darstellung Ihres Floats erhalten, indem Sie den Float an die Integer-Initialisierungsmethode übergeben.

Beispiel:

Int(myFloat)

Beachten Sie, dass alle Zahlen nach dem Dezimalpunkt verloren gehen. Das heißt, 3.9 ist ein Int von 3 und 8.99999 ist eine ganze Zahl von 8.

A'sa Dickens
quelle
7
Und verwenden Sie Int (MyFloat + .5) zum Runden.
Jean Le Moignan
4

Verwenden Sie eine Funktionsstilkonvertierung (im Abschnitt "Ganzzahl- und Gleitkommakonvertierung" von " The Swift Programming Language " [iTunes-Link]).

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

Sie können cast wie folgt eingeben:

 var float:Float = 2.2
 var integer:Int = Int(float)
CNU
quelle
1

Verwenden Sie einfach Typ Casting

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

 println("IntegerValue = \(integerValue)")

Es wird ein Rundungswert angezeigt, z. B.: IntegerValue = 5 bedeutet, dass der Dezimalpunkt ein Verlust ist

Pravin Salame
quelle
0
var i = 1 as Int

var cgf = CGFLoat(i)
Kaledonien
quelle
0
var floatValue = 10.23
var intValue = Int(floatValue)

Dies reicht aus, um von floatnach zu konvertierenInt

Daya Kevin
quelle
0

Angenommen, Sie speichern den Float-Wert in "X"und den Integer-Wert in "Y".

Var Y = Int(x);

oder

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

Verwenden Sie Int64anstelle von Int. Int64kann große int-Werte speichern.

Espe
quelle
Sie meinen, für die ursprüngliche Frage oder für das Problem mit Floateinem Wertebereich größer als Int?
Benc