Swift 3 & 4- 프로토콜에 rounded(_:)
청사진 으로 표시된 방법 사용FloatingPoint
FloatingPoint
프로토콜은 (이 예에 Double
와 Float
따르는 것으로) 청사진 rounded(_:)
방법
func rounded(_ rule: FloatingPointRoundingRule) -> Self
FloatingPointRoundingRule
여러 가지 다른 반올림 규칙을 열거하는 열거 형은 어디에 있습니까?
case awayFromZero
크기가 소스보다 크거나 같은 가장 가까운 허용 값으로 반올림합니다.
case down
소스보다 작거나 같은 가장 가까운 허용 값으로 반올림합니다.
case toNearestOrAwayFromZero
가장 가까운 허용 값으로 반올림합니다. 두 값이 동일하게 가까운 경우 더 큰 크기의 값이 선택됩니다.
case toNearestOrEven
가장 가까운 허용 값으로 반올림합니다. 두 값이 똑같이 가까운 경우 짝수 값이 선택됩니다.
case towardZero
크기가 소스의 크기보다 작거나 같은 가장 가까운 허용 값으로 반올림합니다.
case up
소스보다 크거나 같은 가장 가까운 허용 값으로 반올림합니다.
우리는 @Suragch의 탁월한 답변 과 유사한 예제를 사용 하여 실제로 이러한 다른 반올림 옵션을 보여줍니다.
.awayFromZero
크기가 소스의 크기보다 크거나 같은 가장 가까운 허용 값으로 반올림합니다. 아무 조건의 기호,이 용도로는 C 기능 중 상당 직접 self
, ceil
또는 floor
의 양 및 음의 값을, self
각각.
3.000.rounded(.awayFromZero) // 3.0
3.001.rounded(.awayFromZero) // 4.0
3.999.rounded(.awayFromZero) // 4.0
(-3.000).rounded(.awayFromZero) // -3.0
(-3.001).rounded(.awayFromZero) // -4.0
(-3.999).rounded(.awayFromZero) // -4.0
.down
C floor
함수 와 같습니다 .
3.000.rounded(.down) // 3.0
3.001.rounded(.down) // 3.0
3.999.rounded(.down) // 3.0
(-3.000).rounded(.down) // -3.0
(-3.001).rounded(.down) // -4.0
(-3.999).rounded(.down) // -4.0
.toNearestOrAwayFromZero
C round
함수 와 같습니다 .
3.000.rounded(.toNearestOrAwayFromZero) // 3.0
3.001.rounded(.toNearestOrAwayFromZero) // 3.0
3.499.rounded(.toNearestOrAwayFromZero) // 3.0
3.500.rounded(.toNearestOrAwayFromZero) // 4.0
3.999.rounded(.toNearestOrAwayFromZero) // 4.0
(-3.000).rounded(.toNearestOrAwayFromZero) // -3.0
(-3.001).rounded(.toNearestOrAwayFromZero) // -3.0
(-3.499).rounded(.toNearestOrAwayFromZero) // -3.0
(-3.500).rounded(.toNearestOrAwayFromZero) // -4.0
(-3.999).rounded(.toNearestOrAwayFromZero) // -4.0
이 반올림 규칙은 zero argument rounded()
메소드를 사용하여 액세스 할 수도 있습니다 .
3.000.rounded() // 3.0
// ...
(-3.000).rounded() // -3.0
// ...
.toNearestOrEven
가장 가까운 허용 값으로 반올림합니다. 두 값이 동일하게 가까운 경우 짝수 값이 선택됩니다. C rint
(/와 매우 유사한 nearbyint
) 함수 와 동일 합니다.
3.499.rounded(.toNearestOrEven) // 3.0
3.500.rounded(.toNearestOrEven) // 4.0 (up to even)
3.501.rounded(.toNearestOrEven) // 4.0
4.499.rounded(.toNearestOrEven) // 4.0
4.500.rounded(.toNearestOrEven) // 4.0 (down to even)
4.501.rounded(.toNearestOrEven) // 5.0 (up to nearest)
.towardZero
C trunc
함수 와 같습니다 .
3.000.rounded(.towardZero) // 3.0
3.001.rounded(.towardZero) // 3.0
3.999.rounded(.towardZero) // 3.0
(-3.000).rounded(.towardZero) // 3.0
(-3.001).rounded(.towardZero) // 3.0
(-3.999).rounded(.towardZero) // 3.0
반올림의 목적이 정수로 작업 할 준비를하는 것이라면 (예를 들어 반올림 후 초기화에 Int
의해 사용 FloatPoint
), 우리는 단순히 (또는 등)을 Int
사용하여 초기화 할 때 소수 부분이 잘린다는 사실을 이용할 수 있습니다.Double
Float
Int(3.000) // 3
Int(3.001) // 3
Int(3.999) // 3
Int(-3.000) // -3
Int(-3.001) // -3
Int(-3.999) // -3
.up
C ceil
함수 와 같습니다 .
3.000.rounded(.up) // 3.0
3.001.rounded(.up) // 4.0
3.999.rounded(.up) // 4.0
(-3.000).rounded(.up) // 3.0
(-3.001).rounded(.up) // 3.0
(-3.999).rounded(.up) // 3.0
부록 : FloatingPoint
다른 FloatingPointRoundingRule
규칙 과 C 함수의 동등성을 검증하기 위해 소스 코드 방문
원하는 경우 FloatingPoint
프로토콜 의 소스 코드를 살펴보고 C FloatingPointRoundingRule
규칙 이 공개 규칙 과 동등한 지 직접 확인할 수 있습니다 .
에서 신속 / 다음 stdlib / 공공 / 코어 / FloatingPoint.swift.gyb는 우리의 기본 구현 볼 rounded(_:)
방법은 돌연변이의 우리를 만드는 round(_:)
방법
public func rounded(_ rule: FloatingPointRoundingRule) -> Self {
var lhs = self
lhs.round(rule)
return lhs
}
에서 신속 / 다음 stdlib / 공공 / 코어 / FloatingPointTypes.swift.gyb 우리의 기본 구현 찾을 수 round(_:)
사이의 동등성있는, FloatingPointRoundingRule
규칙 및 기능을 반올림 C가 명백한입니다 :
public mutating func round(_ rule: FloatingPointRoundingRule) {
switch rule {
case .toNearestOrAwayFromZero:
_value = Builtin.int_round_FPIEEE${bits}(_value)
case .toNearestOrEven:
_value = Builtin.int_rint_FPIEEE${bits}(_value)
case .towardZero:
_value = Builtin.int_trunc_FPIEEE${bits}(_value)
case .awayFromZero:
if sign == .minus {
_value = Builtin.int_floor_FPIEEE${bits}(_value)
}
else {
_value = Builtin.int_ceil_FPIEEE${bits}(_value)
}
case .up:
_value = Builtin.int_ceil_FPIEEE${bits}(_value)
case .down:
_value = Builtin.int_floor_FPIEEE${bits}(_value)
}
}
pow()
불행히도 놀이터에서 사용할 수 없습니다