protocol - Convierte Float a Int en Swift
swift downcast (13)
Quiero convertir un Float
a un Int
en Swift. La conversión básica de este tipo no funciona porque estos tipos no son primitivos, a diferencia de float
e int
s en Objective-C
var float: Float = 2.2
var integer: Int = float as Float
Pero esto produce el siguiente mensaje de error:
''Float'' no es convertible a ''Int''
¿Alguna idea de cómo convertir propiedad de Float
a Int
?
Conversión explícita
Convirtiendo a Int perderá cualquier precisión (efectivamente redondeando hacia abajo). Al acceder a las bibliotecas matemáticas puede realizar conversiones explícitas. Por ejemplo:
Si desea redondear 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ñales, por ejemplo.
Convertir 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 choque:
fatal error: floating point value can not be converted to Int because it is greater than Int.max
Así que creé 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
Hay muchas formas de redondear el número con precisión. Con el tiempo, debe usar el método de biblioteca estándar de swift rounded()
para redondear el número de flotación con la precisión deseada.
Para redondear el uso de la regla .up
:
let f: Float = 2.2
let i = Int(f.rounded(.up)) // 3
Para redondear la regla de down del uso:
let f: Float = 2.2
let i = Int(f.rounded(.down)) // 2
Para redondear al entero más cercano use la regla .toNearestOrEven
:
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
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
Puede convertir Float
a Int
en Swift de esta manera:
var myIntValue:Int = Int(myFloatValue)
println "My value is /(myIntValue)"
También puedes lograr este resultado con el comentario de @paulm:
var myIntValue = Int(myFloatValue)
Puede obtener una representación entera de su flotante pasando el flotante al método de inicializador de enteros.
Ejemplo:
Int(myFloat)
Tenga en cuenta que cualquier cantidad después del punto decimal será pérdida. Es decir, 3.9 es un Int de 3 y 8.99999 es un número entero de 8.
Puedes escribir cast como este:
var float:Float = 2.2
var integer:Int = Int(float)
Solo usa el tipo de casting
var floatValue:Float = 5.4
var integerValue:Int = Int(floatValue)
println("IntegerValue = /(integerValue)")
mostrará valor de redondeo, por ejemplo: IntegerValue = 5 significa que el punto decimal será pérdida
Supongamos que almacena el valor flotante en "X"
y está almacenando el valor entero en "Y"
.
Var Y = Int(x);
o
var myIntValue = Int(myFloatValue)
Use Int64
lugar de Int
. Int64
puede almacenar valores int grandes.
Utilice una conversión de estilo de función (se encuentra en la sección titulada "Conversión de entero y punto flotante" de " El lenguaje de programación Swift " . [Enlace de iTunes])
1> Int(3.4)
$R1: Int = 3
var floatValue = 10.23
var intValue = Int(floatValue)
Esto es suficiente para convertir de float
a Int
var i = 1 as Int
var cgf = CGFLoat(i)