반응형
Swift에서 소수점 다루기 완전 정리 (round, floor, ceil, format)
숫자 데이터를 다룰 때 가장 흔한 실수 중 하나가 “소수점 처리”입니다.
Swift에서는 다양한 방식으로 반올림, 버림, 올림, 그리고 자리수 제한을 할 수 있습니다.
이 글에서는 iOS 개발자가 자주 쓰는 소수점 제어 방법을 정리했습니다.
1. 기본 반올림(round), 버림(floor), 올림(ceil)
let num = 3.14159
print(round(num)) // 3.0 (소수점 첫째 자리 반올림)
print(floor(num)) // 3.0 (내림)
print(ceil(num)) // 4.0 (올림)
- 결과
| 함수 | 의미 | 예시 결과 |
| round() | 반올림 | 3.0 |
| floor() | 버림 | 3.0 |
| ceil() | 올림 | 4.0 |
2. 특정 자리수까지 반올림하기
let value = 3.141592
let rounded1 = round(value * 10) / 10 // 소수점 1자리
let rounded2 = round(value * 100) / 100 // 소수점 2자리
let rounded3 = round(value * 1000) / 1000 // 소수점 3자리
print(rounded2) // 3.14
확장 함수로 깔끔하게 사용하기
extension Double {
func rounded(to digits: Int) -> Double {
let multiplier = pow(10.0, Double(digits))
return (self * multiplier).rounded() / multiplier
}
}
let pi = 3.141592
print(pi.rounded(to: 2)) // 3.14
print(pi.rounded(to: 4)) // 3.1416
3. 특정 자리수 버림 / 올림하기
extension Double {
func floor(to digits: Int) -> Double {
let multiplier = pow(10.0, Double(digits))
return floor(self * multiplier) / multiplier
}
func ceil(to digits: Int) -> Double {
let multiplier = pow(10.0, Double(digits))
return ceil(self * multiplier) / multiplier
}
}
let num = 3.141592
print(num.floor(to: 2)) // 3.14
print(num.ceil(to: 2)) // 3.15
4. 문자열 포맷으로 표현하기 (String format)
let num = 3.141592
let formatted = String(format: "%.2f", num)
print(formatted) // "3.14"
| 포멧 | 설명 | 결과 |
| %.1f | 소수점 1자리 | 3.1 |
| %.2f | 소수점 2자리 | 3.14 |
| %.3f | 소수점 3자리 | 3.142 |
5. NumberFormatter 사용 (UI 출력용)
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
let result = formatter.string(from: 1234.567 as NSNumber)
print(result ?? "") // "1,234.57"
주요 옵션
| 속성 | 설명 | 예시 |
| numberStyle | .decimal, .currency, .percent 등 | 숫자 표시 스타일 |
| maximumFractionDigits | 표시할 최대 소수점 자리수 | 2 |
| minimumFractionDigits | 표시할 최소 소수점 자리수 | 2 |
6. NSDecimalNumber로 정확도 높이기
Double은 부동소수점 오차가 생길 수 있으므로
금액 계산처럼 정밀도가 중요한 경우 NSDecimalNumber 사용이 좋습니다.
let a = NSDecimalNumber(string: "0.1")
let b = NSDecimalNumber(string: "0.2")
let sum = a.adding(b)
print(sum) // 0.3
Double에서는 0.1 + 0.2 = 0.30000000000000004 처럼 오차가 발생하지만,
NSDecimalNumber는 정확하게 0.3으로 계산됩니다.
7. Decimal 타입 활용 (Swift Struct)
Decimal은 Swift 구조체 버전의 NSDecimalNumber로, 성능과 안전성이 높습니다.
let x: Decimal = 0.1
let y: Decimal = 0.2
let sum = x + y
print(sum) // 0.3
8. 소수점 반올림 모드 지정 (NSDecimalNumber.RoundingMode)
let behavior = NSDecimalNumberHandler(
roundingMode: .down, // .up, .down, .plain, .bankers
scale: 2,
raiseOnExactness: false,
raiseOnOverflow: false,
raiseOnUnderflow: false,
raiseOnDivideByZero: false
)
let num = NSDecimalNumber(string: "3.456")
let rounded = num.rounding(accordingToBehavior: behavior)
print(rounded) // 3.45
9. SwiftUI / UILabel 표시 시 주의
- Text(String(format: "%.2f", value))
- Text(value, format: .number.precision(.fractionLength(2))) (iOS 15+)
- UILabel.text = String(format: "%.2f", value)
10. 요약
| 목적 | 방법 | 예시 |
| 반올림 | round() 또는 Double.rounded(to:) | 3.14 |
| 버림 | floor() | 3.14 |
| 올림 | ceil() | 3.15 |
| 문자열 표시 | String(format:) | 3.14 |
| UI 포맷 | NumberFormatter | 1,234.57 |
| 정밀 계산 | NSDecimalNumber, Decimal | 정확한 결과 |
반응형
'Dev Study > Swift' 카테고리의 다른 글
| Swift 6.1 기능 정리 (0) | 2025.11.10 |
|---|---|
| Swift 6.0 기능 정리 (0) | 2025.11.10 |
| Swift Throttle vs Debounce 완벽 가이드 (1) | 2025.11.07 |
| Swift class vs final class 비교 (0) | 2025.11.07 |
| Swift 문자열 끝에 ‘…’ 붙이기 (문자열 자르기 Extension) (0) | 2025.11.06 |
| Swift의 @available 과 #available 차이 (0) | 2025.11.06 |
| What’s new in Swift 5.8 (0) | 2023.06.14 |
| What’s new in Swift 5.9 (0) | 2023.06.12 |

