스위프트에서 Float를 Int로 변환


198

나는를 변환 할 FloatInt스위프트있다. 이러한 유형의 캐스팅 은 Objective-C의 floats 및 ints 와 달리 기본 유형이 아니기 때문에 작동하지 않습니다.

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

그러나 이것은 다음과 같은 오류 메시지를 생성합니다.

'Float'은 'Int'로 변환 할 수 없습니다

모든 아이디어를 어떻게에서 속성 변환에 FloatInt?


2
as연산자는 서브 클래스로 다운 캐스트입니다. UIView as UIButton
Jack

2
신속하게 as 키워드를 사용하거나 4 as?와 같은 (as?) 옵션을 사용하여 유형 캐스팅을 수행 할 수 있습니다. 문자열, 4가 문자열 일 수 있으면 작동하지만 작동하지 않으면 작동하지 않습니다. 나는 당신이 당신의 질문에 "캐스팅"이라는 단어를 사용하기 때문에 이것을 제기하고 당신이 혼란스럽게하고 싶지 않았습니다. : 3
A'sa Dickens

코드가 이해가되지 않습니다. float는 Float 유형이므로 이미 Float입니다. var integer : Int = float (같은 오류) 또는 var integer : Int = float as Int를 의미했습니다.
gnasher729

답변:


317

Swift에서 다음과 같이 변환 Float할 수 있습니다 Int.

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

@paulm의 주석 으로이 결과를 얻을 수도 있습니다.

var myIntValue = Int(myFloatValue)

@paulm-시도하지 않았습니다 (주석에 코드 위) . 그러나 그것이 우리에게 효과가있을 수 있습니다 (확실하지 않음) .
iPatel

4
캐스트는 Swift 컴파일러가 변수 유형을 초기화하기에 충분하므로 유형을 명시 적으로 선언 할 필요가 없습니다. var myIntValue = Int(myFloatValue)공장.
Tim Sullivan

(swift 2.0) myFloatvalue.isFinite {...} 인 경우 float 값이 유한 값인지 확인하는 것이 좋습니다.
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)) 는 그 일을합니다.
Grzegorz D.

1
또는 ceil ()을 사용하여 값을 위로 반올림합니다.
Vincent

최첨단 사례 :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

숫자를 정확하게 반올림하는 방법은 많이 있습니다. rounded()부동 소수점을 원하는 정밀도로 반올림 하려면 swift의 표준 라이브러리 방법 을 사용해야 합니다.

라운드 사용 .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

float를 Integer initializer 메소드에 전달하여 float의 정수 표현을 얻을 수 있습니다.

예:

Int(myFloat)

소수점 뒤의 숫자는 손실됩니다. 즉, 3.9는 3의 정수이고 8.99999는 8의 정수입니다.


7
반올림에는 Int (MyFloat + .5)를 사용하십시오.
Jean Le Moignan 2016 년


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.