일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 오픈채팅방
- swift
- DynamicMemberLookup
- 명품cppProgramming c++
- gitflow
- 프로그래머스
- RaceCondition
- SeSAC
- data_structure
- DispatchQueue
- DependencyInjection
- MainScheduler.asyncInstance
- GCD
- rxswift
- leetcode
- MainScheduler.Instance
- CoreBluetooth
- MethodSwilzzling
- 청년취업사관학교
- 코테
- cleanarchitecture
- Realm
- IOS
- SwiftUI
- GIT
- DiffableDataSource
- 등굣길
- MainScheduler
- combine
- SRP
- Today
- Total
Do.
Swift - Float, Double을 Int로 바꾸기, 반올림, 올림, 내림 본문
Swift에서 Float나 Double을 Int로 바꾸는 방법은 굉장히 쉬운데
Int 자료형의 초기화 메소드 인자로 Float 또는 Double을 받아 Int로 생성하는 기능이 있다.
그냥 단순하게
let pi = 3.14
let rtoi = Int(pi) // Int 3
이렇게만 해줘도 정수로 변환 된다.
근데 이 방법을 얘기 하려고 했던 것은 아니고
일반적인 상황에서는 전혀 문제 없는 방법이지만 한가지 실패할 가능성이 있는데 바로 오버플로우이다.
만약에
let dNumber = Double(Int.max) + 1
위와 같은 값이 있다고 했을 때 64비트를 넘어서는 값이 저장이 되었는데 이를
Int(dNumber)
Int 초기화를 통해 변환하고자 하면 에러가 발생한다.
Swift/arm64-apple-ios-simulator.swiftinterface:31508: Fatal error: Double value cannot be converted to Int because the result would be greater than Int.max
Int.max 보다 크기때문에 변환히 불가능 하단다. 물론 64비트를 넘어가는 값을 쓴다는 것도 일반적이진 않지만 (나는 아직까지 경험한 적이 없지만) DSP 분야에서는 있을 수도 있지 않을 까 생각한다.
(참고로 Swift에서 Int는 운영체제에 맞추어서 자동으로 Int32, Int64를 선택한다. 나는 2020 m1 맥북으로 돌리고 있으니 Int 는 자연스레 Int64가 된다.)
그리고 또 중요한 점은 위 에러가 런타임 에러라는 것이다. 컴파일 타임에 걸러지지 않는다는 것이다
앞서 얘기가 길었는데 앞선 방법만큼 쉬우면서도 직관적이고 컴파일 타임에 보호할 수 있는 기능을 소개하려고 한다.
생각해보니 값이 변질됐는데 컴파일 타임에 보호된다는 표현이 말이 안된다. 왜 이따구로 썼을까
애플 문서에 따르면 Kernal Framework의 Math속하는 기능들이라고 하는데 보면 명칭이 C 등에서 쓰던것과 동일하다.
let floatNumber: Float = 3.14
let ftoi = lroundf(floatNumber) // Int 3
let doubleNumber: Double = 3.54
let dtoi = lroundl(doubleNumber) // Int 4
위 코드에서 쓰인 lroundf, lroundl 인데 함수 이름만 봐도 실수를 반올림 한다는 뜻을 가지고 있고 lroundf와 lroundl로 Float냐 Double냐도 구분한다.
아까와 같은 상황에서도
let dNumber = Double(Int.max) + 1 // 9.223372036854776e+18
let toi = lroundl(dNumber) // 9223372036854775807
컴파일 타임, 런타임 에서 모두 에러가 발생하지 않는다. 값은 Int64.max로 잘라 버렸지만.. 애초에 그 이상의 수를 쓰고싶으면 SwiftStandardLibrary 안에서 해결할 건 아니니까..
round 함수의 경우는 무조건 정수로 반올림 해버리는데 이를 올림, 내림 하는 함수도 같은 프레임워크에 존재한다.
let ftoiDown = floorf(floatNumber) // Float 3
let dtoiDown = floor(doubleNumber) // Double 3
let ftofUp = ceilf(floatNumber) // Float 4
let dtodUP = ceill(doubleNumber) // Double 4
이름 부터 바닥이랑 천장이라 이게 올림인지, 내림인지도 직관적으로 볼 수 있다.
더 많은 내용은
An unknown error occurred. Developer Documentation Discover iOS iPadOS macOS tvOS watchOS Safari and Web Games Business Education WWDC Design Human Interface Guidelines Resources Videos Apple Design Awards Fonts Accessibility Localization Accessories Develop Xcode Swift Swift Playgrounds TestFligh...
developer.apple.com
위 애플 문서 참고.
'iOS' 카테고리의 다른 글
표준 라이브러리의 고차함수 (0) | 2022.02.09 |
---|---|
Swift - Class와 Object의 차이점 (0) | 2022.02.09 |
Swift - firstIndex(of:) 가 없을 때 (0) | 2022.02.09 |
Swift - JSON Encoding과 Decoding - Part3 (0) | 2022.02.09 |
Swift - JSON Encoding과 Decoding - Part2 (0) | 2022.02.09 |