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()
на жаль, немає на дитячому майданчику