Convertir Float en Int dans Swift


199

Je veux convertir un Floatà un Intà Swift. Le casting de base comme celui-ci ne fonctionne pas car ces types ne sont pas des primitives, contrairement aux floats et ints dans Objective-C

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

Mais cela produit le message d'erreur suivant:

«Float» n'est pas convertible en «Int»

Une idée de la façon de convertir une propriété Floaten Int?


2
l' asopérateur est pour le down-casting vers les sous-classes. Soit:UIView as UIButton
Jack

2
dans swift, vous pouvez faire un cast de type en utilisant le mot clé as ou facultatif as (as?) tel que 4 as? Chaîne, si 4 peut être une chaîne, cela fonctionnera, mais si ce n'est pas le cas, cela ne fonctionnera pas. J'en parle parce que vous utilisez le mot «casting» dans votre question et je ne voulais pas que vous soyez confus. : 3
A'sa Dickens

Votre code n'a pas de sens. (float as Float) ne fait rien car float est déjà de type Float. Soit vous vouliez dire var entier: Int = float (même erreur) ou var entier: Int = float comme Int.
gnasher729

Réponses:


318

Vous pouvez convertir Floatà IntSwift comme ceci:

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

Vous pouvez également obtenir ce résultat avec le commentaire de @ paulm:

var myIntValue = Int(myFloatValue)

@paulm - Je n'avais pas essayé (code ci-dessus en commentaire) . mais peut-être que cela fonctionnera pour nous (pas sûr) .
iPatel

4
Le transtypage est suffisant pour que le compilateur Swift comprenne le type de variable, vous n'avez donc pas besoin de déclarer explicitement le type. var myIntValue = Int(myFloatValue)travaux.
Tim Sullivan

(swift 2.0) il est préférable de vérifier si la valeur flottante est une valeur finie, si myFloatvalue.isFinite {...}
ZYiOS

116

Conversion explicite

La conversion en Int perdra toute précision (en arrondissant efficacement). En accédant aux bibliothèques mathématiques, vous pouvez effectuer des conversions explicites. Par exemple:

Si vous souhaitez arrondir et convertir en nombre entier:

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

le résultat est 10.

Si vous souhaitez arrondir et convertir en nombre entier:

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

le résultat est 11.

Si vous souhaitez arrondir explicitement à l'entier le plus proche

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

le résultat est 11.

Dans ce dernier cas, cela peut sembler pédant, mais c'est sémantiquement plus clair car il n'y a pas de conversion implicite ... important si vous faites du traitement du signal par exemple.


3
Oui, il vaut vraiment la peine de noter que Int () coupe simplement la partie fractionnaire, ce qui n'est généralement pas le comportement souhaité;) Int (round (f)) fait le travail.
Grzegorz D.

1
Ou ceil () pour arrondir la valeur vers le haut.
Vincent

Cas de bord:round(10.5) == 11.0
itMaxence

26

La conversion est simple:

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

Mais ce n'est pas sûr:

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

Sera due à un joli crash:

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

J'ai donc créé une extension qui gère le débordement:

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

J'espère que cela peut aider quelqu'un


26

Il existe de nombreuses façons d'arrondir les nombres avec précision. Vous devriez éventuellement utiliser la méthode de bibliothèque standard de swift rounded()pour arrondir le nombre flottant avec la précision souhaitée.

Pour arrondir la.up règle d' utilisation :

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

Pour arrondir la.down règle d' utilisation :

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

Pour arrondir à la règle d' utilisation de l'entier le plus proche.toNearestOrEven :

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

Soyez conscient de l'exemple suivant:

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

5

Comme ça:

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

Vous pouvez obtenir une représentation entière de votre float en passant le float dans la méthode d'initialisation Integer.

Exemple:

Int(myFloat)

Gardez à l'esprit que tout nombre après la virgule sera une perte. Cela signifie que 3,9 est un entier de 3 et 8,99999 est un entier de 8.


7
Et utilisez Int (MyFloat + .5) pour l'arrondi.
Jean Le Moignan

4

Utilisez une conversion de style de fonction (trouvée dans la section intitulée «Conversion de nombres entiers et à virgule flottante» de « The Swift Programming Language » . [Lien iTunes])

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

1

Vous pouvez taper cast comme ceci:

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

1

Utilisez simplement la conversion de type

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

 println("IntegerValue = \(integerValue)")

il affichera la valeur d'arrondi, par exemple: IntegerValue = 5 signifie que le point décimal sera une perte



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

Cela suffit pour convertir de floatenInt


0

Supposons que vous stockiez la valeur flottante dans "X"et que vous stockiez la valeur entière dans "Y".

Var Y = Int(x);

ou

var myIntValue = Int(myFloatValue)

-1

Utilisez Int64au lieu de Int. Int64peut stocker de grandes valeurs int.


vous voulez dire, pour la question d'origine, ou pour le problème avec Floatune plage de valeurs plus grande que Int?
benc
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.