Конвертировать Float в Int в Swift

199

Я хочу преобразовать Floatв Intв Swift. Базовое приведение типа не работает, потому что эти типы не являются примитивами, в отличие от floats и ints в Objective-C

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

Но это выдает следующее сообщение об ошибке:

«Float» не конвертируется в «Int»

Любая идея, как свойство конвертировать из Floatв Int?

кэв
источник
2
asоператор для понижающей кинопробы подклассов. то есть:UIView as UIButton
Джек
2
в swift вы можете выполнять приведение типов, используя ключевое слово as или необязательное как (как?), например 4 как? Строка, если 4 может быть строкой, она будет работать, но если это не так, она не будет работать. Я поднимаю это, потому что вы используете слово «кастинг» в своем вопросе, и я не хотел, чтобы вы были сбиты с толку. : 3
Аса Диккенс
Ваш код не имеет смысла. (float as Float) ничего не делает, потому что float уже имеет тип Float. Вы имели в виду var integer: Int = float (та же ошибка) или var integer: Int = float как Int.
gnasher729

Ответы:

318

Вы можете конвертировать Floatв Intв Swift , как это:

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

Вы также можете достичь этого результата с помощью комментария @ paulm:

var myIntValue = Int(myFloatValue)
iPatel
источник
@paulm - я не пробовал (код выше в комментарии) . но может быть, это будет работать для нас (не уверен) .
iPatel
4
Приведения достаточно для того, чтобы компилятор Swift интуитивно понимал тип переменной, поэтому вам не нужно явно объявлять тип. var myIntValue = Int(myFloatValue)работает.
Тим Салливан
(swift 2.0) лучше проверить, является ли значение с плавающей точкой конечным значением, если myFloatvalue.isFinite {...}
ZYiOS
116

Явное преобразование

Преобразование в Int потеряет любую точность (эффективно округляя). Получая доступ к математическим библиотекам, вы можете выполнять явные преобразования. Например:

Если вы хотите округлить и преобразовать в целое число:

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

результат 10.

Если вы хотите округлить и преобразовать в целое число:

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

результат 11.

Если вы хотите явно округлить до ближайшего целого

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

результат 11.

В последнем случае это может показаться педантичным, но семантически понятнее, так как нет неявного преобразования ... важно, например, если вы выполняете обработку сигнала.

user3675131
источник
3
Да, действительно стоит отметить, что Int () просто вырезает дробную часть, что обычно не является желаемым поведением;) Int (round (f)) делает свою работу.
Гжегож Д.
1
Или ceil () для округления значения вверх.
Винсент
round(10.5) == 11.0
Крайний
26

Конвертировать просто:

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

Но это не безопасно

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

Будет из-за приятной аварии:

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

Итак, я создал расширение, которое обрабатывает переполнение:

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

Я надеюсь, что это может помочь кому-то

Артём Разинов
источник
26

Есть много способов округлить число с точностью. В конечном итоге вы должны использовать стандартный библиотечный метод swift rounded()для округления числа с плавающей запятой с желаемой точностью.

Чтобы округлить , используйте .upправило:

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

Для круглого вниз используйте .downправило:

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

Чтобы округлить до ближайшего целого, используйте .toNearestOrEvenправило:

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

Помните о следующем примере:

let f: Float = 2.5
let i = Int(roundf(f)) // 3
let j = Int(f.rounded(.toNearestOrEven)) // 2
Борут Томазин
источник
5

Как это:

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

Вы можете получить целочисленное представление вашего числа с плавающей точкой, передав его в метод инициализатора Integer.

Пример:

Int(myFloat)

Имейте в виду, что любые цифры после десятичной точки будут потерями. Значение 3.9 - это Int из 3, а 8.99999 - это целое число из 8.

Аса Диккенс
источник
7
И используйте Int (MyFloat + .5) для округления.
Жан Ле Муаньян,
4

Используйте преобразование стиля функции (см. Раздел «Преобразование целых чисел и чисел с плавающей точкой» в « Языке программирования Swift». [Ссылка на iTunes])

  1> Int(3.4)
$R1: Int = 3
cobbal
источник
1

Вы можете напечатать приведение как это:

 var float:Float = 2.2
 var integer:Int = Int(float)
CNU
источник
1

Просто используйте тип литья

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

 println("IntegerValue = \(integerValue)")

будет показано значение округления, например: IntegerValue = 5 означает, что десятичная точка будет потеря

правин саламэ
источник
0
var floatValue = 10.23
var intValue = Int(floatValue)

Этого достаточно, чтобы преобразовать из floatвInt

Дая Кевин
источник
0

Предположим, вы храните значение с плавающей запятой в "X"и целочисленное значение в "Y".

Var Y = Int(x);

или

var myIntValue = Int(myFloatValue)
Шашикант Касходхан
источник
-1

Используйте Int64вместо Int. Int64может хранить большие значения int.

осина
источник
Вы имеете в виду, для первоначального вопроса, или для проблемы с Floatдиапазоном значений, большим, чем Int?
Benc