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?


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)

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


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


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

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

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.


7
E use Int (MyFloat + .5) para arredondar.
9789 Jean-Moignan


1

Você pode digitar o elenco assim:

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

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



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

Isso é suficiente para converter de floatparaInt


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)

-1

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


você quer dizer, para a pergunta original ou para o problema de Floatter um intervalo de valores maior que Int?
benc
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.