Перетворити Float в Int в Swift


198

Я хочу перетворити 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
швидко, ви можете робити тип кастингу, використовуючи ключове слово або необов'язково, як (як?), наприклад 4 як? Рядок, якщо 4 може бути рядком, він буде працювати, але якщо це не так, він не буде працювати. Я доводжу це, тому що ви використовуєте слово "кастинг" у своєму питанні, і я не хотів, щоб вас плутали. : 3
A'sa Діккенс

Ваш код не має сенсу. (float як Float) нічого не робить, тому що float вже є типу Float. Ви або мали на увазі var ціле число: Int = float (та сама помилка) або var integer: Int = float як Int.
gnasher729

Відповіді:


317

Ви можете конвертувати Floatв Intв Swift , як це:

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

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

var myIntValue = Int(myFloatValue)

@paulm - я не пробував (вище код у коментарі) . але, можливо, це буде працювати для нас (не впевнений) .
iPatel

4
Кінець достатній для компілятора Swift для інтуїції типу змінної, тому вам не потрібно чітко оголошувати тип. var myIntValue = Int(myFloatValue)працює.
Тім Салліван

(swift 2.0) краще перевірити, чи значення float є кінцевим значенням, якщо 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.

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


3
Так, дійсно варто відзначити, що Int () просто скорочує дробову частину, яка зазвичай не є бажаною поведінкою;) Int (round (f)) виконує цю роботу.
Гжегож Д.

1
Або ceil (), щоб округлити значення вгору.
Вінсент

Випадок краю:round(10.5) == 11.0
itMaxence

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) для округлення.
Жан Ле Мойнан


1

Ви можете ввести ролях так:

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

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

Припустимо, ви зберігаєте значення float у "X"і ви зберігаєте ціле значення у "Y".

Var Y = Int(x);

або

var myIntValue = Int(myFloatValue)

-1

Використовуйте Int64замість Int. Int64може зберігати великі значення int.


ви маєте на увазі, для оригінального запитання, або для проблеми з Floatдіапазоном значень, більшим за Int?
BENC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.