Ich versuche, einen Rechner für die Wachstumsrate ( Double
) zu erstellen, der das Ergebnis auf die nächste Ganzzahl rundet und von dort aus neu berechnet:
let firstUsers = 10.0
let growth = 0.1
var users = firstUsers
var week = 0
while users < 14 {
println("week \(week) has \(users) users")
users += users * growth
week += 1
}
aber ich war bisher nicht in der Lage.
BEARBEITEN Ich habe es irgendwie so gemacht:
var firstUsers = 10.0
let growth = 0.1
var users:Int = Int(firstUsers)
var week = 0
while users <= 14 {
println("week \(week) has \(users) users")
firstUsers += firstUsers * growth
users = Int(firstUsers)
week += 1
}
Obwohl es mir nichts ausmacht, dass es immer abgerundet wird, mag ich es nicht, weil firstUsers
es eine Variable werden und sich im Laufe des Programms ändern musste (um die nächste Berechnung durchzuführen), was ich nicht möchte, dass es passiert.
pow()
leider nicht auf einem Spielplatz verfügbarpow()
ist in der Darwin-Bibliothek definiert, daher müssen Sieimport Darwin
zuerst (oderimport Foundation
oderimport Cocoa
oderimport UIKit
, die alle Darwin intern importieren).lround()
welche eine zurückgibtInt
.round()
Rundet immer auf, wenn die Dezimalstelle> = .5 ist, und ab, wenn es <.5 ist (Standardrundung)." Außer wenn es nicht so ist.round(-16.5)
gibt -17 zurück, nicht -16. Ist das ein Fehler?Verwenden Sie einfach, um ein Double auf die nächste Ganzzahl zu runden
round()
.Wenn Sie den ursprünglichen Wert nicht ändern möchten, verwenden Sie
rounded()
:Wie zu erwarten ( oder auch nicht ) wird eine Zahl wie
3.5
aufgerundet und eine Zahl wie-3.5
abgerundet. Wenn Sie ein anderes Rundungsverhalten benötigen, können Sie eine der Rundungsregeln verwenden . Beispielsweise:Wenn Sie eine tatsächliche benötigen, wandeln Sie sie
Int
einfach in eine um (aber nur, wenn Sie sicher sind, dass das Double nicht größer ist alsInt.max
):Anmerkungen
round
,lround
,floor
, undceil
. Nachdem Swift diese Funktionalität integriert hat, kann ich die Verwendung dieser Funktionen nicht mehr empfehlen. Vielen Dank an @dfri für den Hinweis. Schauen Sie sich hier die ausgezeichnete Antwort von @ dfri an . Ich habe auch etwas Ähnliches gemacht, um a zu rundenCGFloat
.quelle
Swift 3 & 4 - Verwendung der
rounded(_:)
imFloatingPoint
Protokoll festgelegten MethodeDas
FloatingPoint
Protokoll (zB , zu derDouble
undFloat
Konform) Items herzustellen dasrounded(_:)
VerfahrenWo
FloatingPointRoundingRule
ist eine Aufzählung, die eine Reihe verschiedener Rundungsregeln auflistet: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
oderfloor
, für positive und negative Werteself
dargestellt..down
Entspricht der C-
floor
Funktion..toNearestOrAwayFromZero
Entspricht der C-
round
Funktion.Diese Rundungsregel kann auch über die Null - Argument aufgerufen wird
rounded()
Methode ..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 zunearbyint
)..towardZero
Entspricht der C-
trunc
Funktion.Wenn der Zweck der Rundung darin besteht, die Arbeit mit einer Ganzzahl vorzubereiten (z. B. Verwendung
Int
durchFloatPoint
Initialisierung nach dem Runden), können wir einfach die Tatsache nutzen, dass beim Initialisieren einerInt
Verwendung einerDouble
(oderFloat
usw.) der Dezimalteil abgeschnitten wird..up
Entspricht der C-
ceil
Funktion.Nachtrag: Besuchen Sie den Quellcode, um
FloatingPoint
zu überprüfen, ob die C-Funktionen den verschiedenenFloatingPointRoundingRule
Regeln entsprechenWenn wir möchten, können wir uns den Quellcode für das
FloatingPoint
Protokoll ansehen, um die C-Funktion zu sehen, die den öffentlichenFloatingPointRoundingRule
Regeln entspricht.Aus swift / stdlib / public / core / FloatingPoint.swift.gyb sehen wir, dass die Standardimplementierung der
rounded(_:)
Methode uns zur mutierendenround(_:)
Methode macht:Aus swift / stdlib / public / core / FloatingPointTypes.swift.gyb finden wir die Standardimplementierung von
round(_:)
, in der die Äquivalenz zwischen denFloatingPointRoundingRule
Regeln und den C-Rundungsfunktionen offensichtlich ist:quelle
quelle
Swift 3: Wenn Sie auf eine bestimmte Ziffer runden möchten, z. B. 5.678434 -> 5.68, können Sie einfach die Funktion round () oder roundf () mit einer Multiplikation kombinieren:
quelle
Sie können FloatingPoint in Swift 3 auch wie folgt erweitern:
quelle
Self
bedeutet das?Swift 3
quelle
myNum.rounded()
ändert sich nichtmyNum
,myNum.round()
tut es aber .Möglicherweise möchten Sie auch überprüfen, ob das Double höher als der maximale Int-Wert ist, bevor Sie versuchen, den Wert in einen Int zu konvertieren.
quelle
Eine sehr einfache Lösung hat für mich funktioniert:
Nummer enthält Wert 2
quelle