Swift 3 & 4 - Verwendung der rounded(_:)im FloatingPointProtokoll festgelegten Methode
Das FloatingPointProtokoll (zB , zu der Doubleund FloatKonform) Items herzustellen das rounded(_:)Verfahren
func rounded(_ rule: FloatingPointRoundingRule) -> Self
Wo FloatingPointRoundingRuleist 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, ceiloder floor, für positive und negative Werte selfdargestellt.
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- floorFunktion.
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- roundFunktion.
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- truncFunktion.
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 Intdurch FloatPointInitialisierung nach dem Runden), können wir einfach die Tatsache nutzen, dass beim Initialisieren einer IntVerwendung einer Double(oder Floatusw.) 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- ceilFunktion.
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 FloatingPointzu überprüfen, ob die C-Funktionen den verschiedenen FloatingPointRoundingRuleRegeln entsprechen
Wenn wir möchten, können wir uns den Quellcode für das FloatingPointProtokoll ansehen, um die C-Funktion zu sehen, die den öffentlichen FloatingPointRoundingRuleRegeln 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 FloatingPointRoundingRuleRegeln 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