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?


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)

@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.


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


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

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

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.


77
Y use Int (MyFloat + .5) para redondear.
Jean Le Moignan


1

Puedes escribir cast así:

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

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



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

Esto es suficiente para convertir de floataInt


0

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

Var Y = Int(x);

o

var myIntValue = Int(myFloatValue)

-1

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


quieres decir, para la pregunta original, o para el problema de Floattener un rango de valores mayor que Int?
benc
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.