Conversão Float para Int em Swift

199

Eu quero converter um Floatpara um Intno Swift. Fundição básicas como isso não funciona porque esses tipos não são primitivos, ao contrário de floats e ints em Objective-C

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

Mas isso produz a seguinte mensagem de erro:

'Float' não é conversível em 'Int'

Alguma idéia de como converter propriedade de Floatpara Int?

kev
fonte
2
o asoperador é para fazer a conversão para subclasses. ou seja:UIView as UIButton
Jack
2
rapidamente, você pode fazer a conversão de tipo usando a palavra-chave as ou opcional como (as?) como 4 como? String, se 4 puder ser uma string, funcionará, mas se não for, não funcionará. Trago isso à tona porque você usa a palavra "elenco" na sua pergunta e não queria que você ficasse confuso. : 3
A'sa Dickens
Seu código não faz sentido. (float como Float) não faz nada porque float já é do tipo Float. Você quis dizer var número inteiro: Int = float (mesmo erro) ou var número inteiro: Int = float como Int.
gnasher729

Respostas:

318

Você pode converter Floatpara Intno Swift assim:

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

Você também pode obter esse resultado com o comentário de @ paulm:

var myIntValue = Int(myFloatValue)
iPatel
fonte
@ paulm - eu não tinha tentado (código acima no comentário) . mas pode ser que funcione para nós (não tenho certeza) .
iPatel 6/06/14
4
A conversão é suficiente para o compilador Swift intuir o tipo de variável, portanto, você não precisa declarar explicitamente o tipo. var myIntValue = Int(myFloatValue)trabalho.
Tim Sullivan
(swift 2.0) é melhor verificar se o valor flutuante é um valor finito, se myFloatvalue.isFinite {...}
ZYiOS
116

Conversão explícita

A conversão para Int perderá qualquer precisão (efetivamente arredondando para baixo). Ao acessar as bibliotecas de matemática, você pode executar conversões explícitas. Por exemplo:

Se você deseja arredondar para baixo e converter para número inteiro:

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

resultado é 10.

Se você deseja arredondar para cima e converter para número inteiro:

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

resultado é 11.

Se você deseja arredondar explicitamente para o número inteiro mais próximo

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

resultado é 11.

No último caso, isso pode parecer pedante, mas é semanticamente mais claro, pois não há conversão implícita ... importante se você estiver processando o sinal, por exemplo.

user3675131
fonte
3
Sim, é realmente interessante notar que Int () simplesmente corta a parte fracionária, que geralmente não é o comportamento desejado;) Int (rodada (f)) faz o trabalho.
Grzegorz D.
1
Ou ceil () para arredondar o valor para cima.
30715 Vincent
Caso extremo:round(10.5) == 11.0
itMaxence
26

A conversão é simples:

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

Mas não é seguro:

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

Será devido a um bom acidente:

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

Então, eu criei uma extensão que lida com o estouro:

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 isso possa ajudar alguém

Artyom Razinov
fonte
26

Existem várias maneiras de arredondar números com precisão. Você deve eventualmente usar o método de biblioteca padrão da swift rounded()para arredondar o número da bóia com a precisão desejada.

Para arredondar a.up regra de uso :

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

Para arredondar para baixo, use a .downregra:

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

Para arredondar para o número inteiro mais próximo, use a .toNearestOrEvenregra:

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

Esteja ciente do seguinte exemplo:

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

Como isso:

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

Você pode obter uma representação inteira do seu float passando o float para o método inicializador Integer.

Exemplo:

Int(myFloat)

Lembre-se de que qualquer número após o ponto decimal será uma perda. Significado, 3,9 é um Int de 3 e 8,99999 é um número inteiro de 8.

A'sa Dickens
fonte
7
E use Int (MyFloat + .5) para arredondar.
9789 Jean-Moignan
4

Use uma conversão de estilo de função (encontrada na seção "Conversão de números inteiros e de ponto flutuante" em " A linguagem de programação Swift " . [Link do iTunes])

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

Você pode digitar o elenco assim:

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

Basta usar a conversão de tipo

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

 println("IntegerValue = \(integerValue)")

mostrará o valor do arredondamento, por exemplo: Valor inteiro = 5 significa que o ponto decimal será perda

pravin salame
fonte
0
var i = 1 as Int

var cgf = CGFLoat(i)
Caledônia
fonte
0
var floatValue = 10.23
var intValue = Int(floatValue)

Isso é suficiente para converter de floatparaInt

Daya Kevin
fonte
0

Suponha que você armazene o valor flutuante "X"e esteja armazenando o valor inteiro "Y".

Var Y = Int(x);

ou

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

Use em Int64vez de Int. Int64pode armazenar grandes valores int.

Aspen
fonte
você quer dizer, para a pergunta original ou para o problema de Floatter um intervalo de valores maior que Int?
benc