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
Еквівалентна 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
Еквівалентна 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
До цього правила округлення також можна отримати доступ, використовуючи 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
Еквівалентна 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
Еквівалентна 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перевірки відповідності функцій C різним FloatingPointRoundingRuleправилам
Якщо ми хочемо, ми можемо подивитися на вихідний код FloatingPointпротоколу, щоб безпосередньо побачити еквіваленти функції C загальнодоступним FloatingPointRoundingRuleправилам.
З swift / stdlib / public / core / FloatingPoint.swift.gyb ми бачимо, що реалізація rounded(_:)методу за замовчуванням робить нас round(_:)методом мутації :
public func rounded(_ rule: FloatingPointRoundingRule) -> Self {
var lhs = self
lhs.round(rule)
return lhs
}
З swift / stdlib / public / core / 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()на жаль, немає на дитячому майданчику