Swift 3 & 4 - Verwendung der rounded(_:)
im FloatingPoint
Protokoll festgelegten Methode
Das FloatingPoint
Protokoll (zB , zu der Double
und Float
Konform) Items herzustellen das rounded(_:)
Verfahren
func rounded(_ rule: FloatingPointRoundingRule) -> Self
Wo FloatingPointRoundingRule
ist eine Aufzählung, die eine Reihe verschiedener Rundungsregeln auflistet:
case awayFromZero
Runden Sie auf den nächsten zulässigen Wert, dessen Größe größer oder gleich der der Quelle ist.
case down
Runden Sie auf den nächsten zulässigen Wert, der kleiner oder gleich der Quelle ist.
case toNearestOrAwayFromZero
Auf den nächsten zulässigen Wert runden; Wenn zwei Werte gleich nahe beieinander liegen, wird der mit der größeren Größe ausgewählt.
case toNearestOrEven
Auf den nächsten zulässigen Wert runden; Wenn zwei Werte gleich nahe beieinander liegen, wird der gerade gewählt.
case towardZero
Runden Sie auf den nächsten zulässigen Wert, dessen Größe kleiner oder gleich der der Quelle ist.
case up
Runden Sie auf den nächsten zulässigen Wert, der größer oder gleich der Quelle ist.
Wir verwenden ähnliche Beispiele wie die aus @ Suragchs hervorragender Antwort , um diese verschiedenen Rundungsoptionen in der Praxis zu zeigen.
.awayFromZero
Auf den nächsten zulässigen Wert runden, dessen Größe größer oder gleich der der Quelle ist; keine direkte unter den C - Funktionen äquivalent, da diese Anwendungen, bedingt auf Zeichen von self
, ceil
oder floor
, für positive und negative Werte self
dargestellt.
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
Entspricht der C- floor
Funktion.
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
Entspricht der C- round
Funktion.
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
Diese Rundungsregel kann auch über die Null - Argument aufgerufen wird rounded()
Methode .
3.000.rounded() // 3.0
// ...
(-3.000).rounded() // -3.0
// ...
.toNearestOrEven
Auf den nächsten zulässigen Wert runden; Wenn zwei Werte gleich nahe beieinander liegen, wird der gerade gewählt. äquivalent zur C-Funktion rint
(/ sehr ähnlich zu 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
Entspricht der C- trunc
Funktion.
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
Wenn der Zweck der Rundung darin besteht, die Arbeit mit einer Ganzzahl vorzubereiten (z. B. Verwendung Int
durch FloatPoint
Initialisierung nach dem Runden), können wir einfach die Tatsache nutzen, dass beim Initialisieren einer Int
Verwendung einer Double
(oder Float
usw.) der Dezimalteil abgeschnitten wird.
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
Entspricht der C- ceil
Funktion.
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
Nachtrag: Besuchen Sie den Quellcode, um FloatingPoint
zu überprüfen, ob die C-Funktionen den verschiedenen FloatingPointRoundingRule
Regeln entsprechen
Wenn wir möchten, können wir uns den Quellcode für das FloatingPoint
Protokoll ansehen, um die C-Funktion zu sehen, die den öffentlichen FloatingPointRoundingRule
Regeln entspricht.
Aus swift / stdlib / public / core / FloatingPoint.swift.gyb sehen wir, dass die Standardimplementierung der rounded(_:)
Methode uns zur mutierenden round(_:)
Methode macht:
public func rounded(_ rule: FloatingPointRoundingRule) -> Self {
var lhs = self
lhs.round(rule)
return lhs
}
Aus swift / stdlib / public / core / FloatingPointTypes.swift.gyb finden wir die Standardimplementierung von round(_:)
, in der die Äquivalenz zwischen den FloatingPointRoundingRule
Regeln und den C-Rundungsfunktionen offensichtlich ist:
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()
leider nicht auf einem Spielplatz verfügbar