J'essaie de faire un calculateur du taux de croissance ( Double
) qui arrondira le résultat à l'entier le plus proche et recalculera à partir de là, comme tel:
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
}
mais je n'ai pas pu jusqu'ici.
EDIT Je l'ai fait un peu comme ça:
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
}
Bien que cela ne me dérange pas qu'il soit toujours arrondi, je n'aime pas cela car il firstUsers
a dû devenir une variable et changer tout au long du programme (afin de faire le prochain calcul), ce que je ne veux pas que cela se produise.
pow()
malheureusement pas disponible dans une aire de jeuxpow()
est défini dans la bibliothèque Darwin, vous devez donc d'import Darwin
abord (ouimport Foundation
ouimport Cocoa
ouimport UIKit
, qui finissent tous par importer Darwin en interne).lround()
qui renvoie unInt
.round()
arrondit toujours vers le haut lorsque la décimale est> = .5 et vers le bas quand il est <.5 (arrondi standard)." Sauf quand ce n'est pas le cas.round(-16.5)
renvoie -17, pas -16. Est-ce un bug?Pour arrondir un double à l'entier le plus proche, utilisez simplement
round()
.Si vous ne souhaitez pas modifier la valeur d'origine, utilisez
rounded()
:Comme on pouvait s'y attendre ( ou pas ), un nombre comme
3.5
est arrondi vers le haut et un nombre comme-3.5
est arrondi vers le bas. Si vous avez besoin d'un comportement d'arrondi différent de celui-ci, vous pouvez utiliser l'une des règles d'arrondi . Par exemple:Si vous avez besoin d'un réel, lancez-le
Int
simplement en un (mais seulement si vous êtes certain que le Double ne sera pas supérieur àInt.max
):Remarques
round
,lround
,floor
etceil
. Cependant, maintenant que Swift a cette fonctionnalité intégrée, je ne peux plus recommander d'utiliser ces fonctions. Merci à @dfri de me l'avoir signalé. Découvrez l'excellente réponse de @ dfri ici . J'ai également fait quelque chose de similaire pour arrondir aCGFloat
.la source
Swift 3 & 4 - utiliser la
rounded(_:)
méthode telle que définie dans leFloatingPoint
protocoleLe
FloatingPoint
protocole (auquel par exempleDouble
et seFloat
conforme) définit larounded(_:)
méthodeOù
FloatingPointRoundingRule
est une énumération énumérant un certain nombre de règles d'arrondi différentes:Nous utilisons des exemples similaires à ceux de l'excellente réponse de @ Suragch pour montrer ces différentes options d'arrondi dans la pratique.
.awayFromZero
Arrondir à la valeur autorisée la plus proche dont la magnitude est supérieure ou égale à celle de la source; pas d'équivalent direct parmi les fonctions C, car cela utilise, conditionnellement au signe de
self
,ceil
oufloor
, pour des valeurs positives et négatives deself
, respectivement..down
Équivalent à la
floor
fonction C..toNearestOrAwayFromZero
Équivalent à la
round
fonction C.Cette règle d'arrondi est également accessible en utilisant la
rounded()
méthode d' argument zéro ..toNearestOrEven
Arrondir à la valeur autorisée la plus proche; si deux valeurs sont également proches, la paire est choisie; équivalent à la fonction C
rint
(/ très similaire ànearbyint
)..towardZero
Équivalent à la
trunc
fonction C.Si le but de l'arrondi est de se préparer à travailler avec un entier (par exemple en utilisant
Int
parFloatPoint
initialisation après arrondi), nous pourrions simplement utiliser le fait que lors de l'initialisation d'un enInt
utilisant aDouble
(ouFloat
etc), la partie décimale sera tronquée..up
Équivalent à la
ceil
fonction C.Addendum: visite du code source pour
FloatingPoint
vérifier l'équivalence des fonctions C aux différentesFloatingPointRoundingRule
règlesSi nous le souhaitons, nous pouvons jeter un œil au code source du
FloatingPoint
protocole pour voir directement les équivalents de fonction C desFloatingPointRoundingRule
règles publiques .Depuis swift / stdlib / public / core / FloatingPoint.swift.gyb, nous voyons que l'implémentation par défaut de la
rounded(_:)
méthode nous fait de laround(_:)
méthode de mutation :Depuis swift / stdlib / public / core / FloatingPointTypes.swift.gyb, nous trouvons l'implémentation par défaut de
round(_:)
, dans laquelle l'équivalence entre lesFloatingPointRoundingRule
règles et les fonctions d'arrondi C est apparente:la source
la source
Swift 3: Si vous voulez arrondir à un certain nombre de chiffres, par exemple 5,678434 -> 5,68, vous pouvez simplement combiner la fonction round () ou roundf () avec une multiplication:
la source
Vous pouvez également étendre FloatingPoint dans Swift 3 comme suit:
la source
Self
signifie?Swift 3
la source
myNum.rounded()
ne change pasmyNum
, maismyNum.round()
change.Vous pouvez également vérifier si le double est supérieur à la valeur Int max avant d'essayer de convertir la valeur en Int.
la source
Une solution très simple a fonctionné pour moi:
nombre contient la valeur 2
la source