Swift에서 소수점을 표현하는데 사용되는 여러 가지 타입이 있다. 이들은 모두 FloatingPoint 라는 프로토콜을 준수한다. FloatingPoint 프로토콜은 부동 소수점 숫자를 나타내는 타입으로, 이를 준수하는 객체는 고유한 정밀도(precision)을 갖는다. Double 타입은 15자리의 정밀도를 갖고 있어 소수점 이하 15번째 자리까지 표현할 수 있으며, Float 타입은 6자리의 정밀도를 갖고 있어 소수점 이하 6번째 자리까지 표현할 수 있다.

let randomFloat = Float.random(in: 0...10) // 2.959846
let randomDouble = Double.random(in: 0...10) // 5.137981249907981

FloatingPoint.swift에는 소수점을 다루는 다양한 메소드를 제공한다.

func rounded(_ rule: FloatingPointRoundingRule) -> Self
mutating func round(_ rule: FloatingPointRoundingRule) -> Self

// extension FloatingPoint
public func rounded() -> Self {
  return rounded(.toNearestOrAwayFromZero)
}

public mutating func round() {
  round(.toNearestOrAwayFromZero)
}

그런데 FloatingPointRoundingRule이라는 낯선 타입이 눈에 띈다. 이름에서 짐작할 수 있듯이 부동 소수점 숫자를 어떻게 반올림 할 것인지 명시하는 규칙이다. 위와 같이 반올림 규칙은 toNearestOfAwayFromZero인데 올림, 내림과 관련된 규칙은 무엇일까?

FloatingPointRoundingRule

FloatingPointRoundingRule은 부동 소수점 숫자를 반올림하는 규칙이다.

public enum FloatingPointRoundingRule {
  case awayFromZero
  case down
  case toNearestOrAwayFromZero
  case toNearestOrEven
  case towardZero
  case up
}

1. awayFromZero

숫자보다 크거나 같은 가장 가까운 값으로 반올림 한다.

(5.2).rounded(.awayFromZero)  // 6.0
(5.5).rounded(.awayFromZero)  // 6.0
(-5.2).rounded(.awayFromZero) // -6.0
(-5.5).rounded(.awayFromZero) // -6.0

2. down

숫자보다 작거나 같은 가장 가까운 값으로 반올림 한다. 이 규칙은 C의 floor 함수와 동일하며, IEEE 754 사양에서 정의한 roundToIntegralTowardNegative 연산을 구현한다.

(5.2).rounded(.down)  // 5.0
(5.5).rounded(.down)  // 5.0
(-5.2).rounded(.down) // -6.0
(-5.5).rounded(.down) // -6.0

3. toNearestOrAwayFromZero

가장 가까운 값으로 반올림 한다. 두 값이 똑같이 가깝다면 크기가 더 큰 값이 선택된다. 이 규칙을 ‘Schoolbook 반올림’ 이라고도 한다. 이 규칙은 C의 round 함수와 동일하며, IEEE 754 사양에서 정의한 roundToIntegralTiesToAway 연산을 구현한다.

(5.2).rounded(.toNearestOrAwayFromZero)  // 5.0
(5.5).rounded(.toNearestOrAwayFromZero)  // 6.0
(-5.2).rounded(.toNearestOrAwayFromZero) // -5.0
(-5.5).rounded(.toNearestOrAwayFromZero) // -6.0

4. toNearestOrEven

가장 가까운 값으로 반올림 한다. 두 값이 똑같이 가까우면 짝수 값이 선택된다. 이 규칙을 ‘Bankers 반올림' 이라고도 한다. 이 규칙은 IEEE 754 사양에서 정의한 roundToIntegralTiesToEven 연산을 구현한다.