반응형

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 정확한 결과

 

반응형
Posted by 까칠코더
,