Convertir Float a Int en Swift

199

Quiero convertir una Floata una Inten Swift. Moldeo básico como este no funciona debido a que estos tipos no son primitivas, a diferencia de floats y intS en Objective-C

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

Pero esto produce el siguiente mensaje de error:

'Flotar' no es convertible a 'Int'

¿Alguna idea de cómo convertir de propiedad Floata Int?

kev
fuente
2
el asoperador es para bajar a subclases. es decir:UIView as UIButton
Jack
2
en swift, puede realizar la conversión de tipos utilizando la palabra clave as u opcional como (como?) como 4 como? Cadena, si 4 puede ser una cadena, funcionará, pero si no lo es, no funcionará. Menciono esto porque usas la palabra "casting" en tu pregunta y no quería que te confundieras. : 3
A'sa Dickens
Tu código no tiene sentido. (float as Float) no hace nada porque float ya es del tipo Float. Usted quiso decir var integer: Int = float (mismo error) o var integer: Int = float como Int.
gnasher729

Respuestas:

318

Puede convertir Floata Inten Swift así:

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

También puede lograr este resultado con el comentario de @paulm:

var myIntValue = Int(myFloatValue)
iPatel
fuente
@paulm: no lo había intentado (código anterior en el comentario) . pero podría funcionar para nosotros (no estoy seguro) .
iPatel
44
La conversión es suficiente para que el compilador Swift intuya el tipo de variable, por lo que no necesita declarar explícitamente el tipo. var myIntValue = Int(myFloatValue)trabajos.
Tim Sullivan
(swift 2.0) es mejor verificar si el valor flotante es un valor finito, si myFloatvalue.isFinite {...}
ZYiOS
116

Conversión explícita

La conversión a Int perderá cualquier precisión (redondeando efectivamente hacia abajo). Al acceder a las bibliotecas de matemáticas, puede realizar conversiones explícitas. Por ejemplo:

Si desea redondear hacia abajo y convertir a entero:

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

el resultado es 10.

Si desea redondear y convertir a entero:

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

el resultado es 11.

Si desea redondear explícitamente al entero más cercano

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

el resultado es 11.

En el último caso, esto puede parecer pedante, pero es semánticamente más claro ya que no hay conversión implícita ... importante si está haciendo procesamiento de señal, por ejemplo.

usuario3675131
fuente
3
Sí, realmente vale la pena señalar que Int () simplemente corta la parte fraccional, que generalmente no es el comportamiento deseado;) Int (round (f)) hace el trabajo.
Grzegorz D.
1
O ceil () para redondear el valor hacia arriba.
Vincent
Caso de borde:round(10.5) == 11.0
itMaxence
26

La conversión es simple:

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

Pero no es seguro:

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

Will debido a un buen accidente:

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

Así que he creado una extensión que maneja el desbordamiento:

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

Espero que esto pueda ayudar a alguien

Artyom Razinov
fuente
26

Hay muchas formas de redondear números con precisión. Eventualmente, debe usar el método de biblioteca estándar de swift rounded()para redondear el número flotante con la precisión deseada.

Para redondear , use la .upregla:

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

Para redondear , use la .downregla:

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

Para redondear al entero más cercano, use la .toNearestOrEvenregla:

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

Tenga en cuenta el siguiente ejemplo:

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

Me gusta esto:

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

Puede obtener una representación entera de su flotador pasando el flotador al método de inicializador de enteros.

Ejemplo:

Int(myFloat)

Tenga en cuenta que cualquier número después del punto decimal será una pérdida. Es decir, 3.9 es un Int de 3 y 8.99999 es un entero de 8.

A'sa Dickens
fuente
77
Y use Int (MyFloat + .5) para redondear.
Jean Le Moignan
4

Utilice una conversión de estilo de función (que se encuentra en la sección denominada "Conversión de enteros y coma flotante" de " El lenguaje de programación Swift " [enlace de iTunes])

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

Puedes escribir cast así:

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

Solo usa tipo casting

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

 println("IntegerValue = \(integerValue)")

mostrará el valor de redondeo, por ejemplo: IntegerValue = 5 significa que el punto decimal será pérdida

pravin salame
fuente
0
var i = 1 as Int

var cgf = CGFLoat(i)
Caledonia
fuente
0
var floatValue = 10.23
var intValue = Int(floatValue)

Esto es suficiente para convertir de floataInt

Daya Kevin
fuente
0

Supongamos que almacena el valor flotante "X"y almacena el valor entero "Y".

Var Y = Int(x);

o

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

Usar en Int64lugar de Int. Int64puede almacenar grandes valores int.

Álamo temblón
fuente
quieres decir, para la pregunta original, o para el problema de Floattener un rango de valores mayor que Int?
benc