Quelqu'un peut-il me dire comment arrondir une valeur double à x nombre de décimales dans Swift?
J'ai:
var totalWorkTimeInHours = (totalWorkTime/60/60)
Avec totalWorkTime
être un NSTimeInterval (double) en seconde.
totalWorkTimeInHours
me donnera les heures, mais cela me donne la quantité de temps dans un nombre aussi long et précis, par exemple 1,543240952039 ......
Comment arrondir cela à, disons, 1,543 lorsque j'imprime totalWorkTimeInHours
?
ios
swift
double
nstimeinterval
Leighton
la source
la source
round(_:)
,Double
round()
,NSString
initialiseur,String
initialiseur,NumberFormatter
, double extension ou mêmeNSDecimalNumber
etDecimal
.Réponses:
Vous pouvez utiliser la
round
fonction de Swift pour accomplir cela.Pour arrondir une
Double
précision à 3 chiffres, multipliez-la d'abord par 1000, arrondissez-la et divisez le résultat arrondi par 1000:Hormis tout type de
printf(...)
ouString(format: ...)
solutions, le résultat de cette opération est toujours de typeDouble
.EDIT:
En ce qui concerne les commentaires selon lesquels cela ne fonctionne parfois pas, veuillez lire ceci:
Ce que chaque programmeur devrait savoir sur l'arithmétique à virgule flottante
la source
let rate = 9.94999999999; Double(round(rate * 100) / 100);
Sortie:9.94999999999, 9.949999999999999
ne fonctionne que pour l'impression, mais comment puis-je l'assigner à une variable?Extension pour Swift 2
Une solution plus générale est l'extension suivante, qui fonctionne avec Swift 2 et iOS 9:
Extension pour Swift 3
Dans Swift 3
round
est remplacé parrounded
:Exemple qui renvoie Double arrondi à 4 décimales:
la source
round(8.46 * pow(10.0, 3.0)) / pow(10.0, 3.0)
renvoie8.460000000000001
. Faire de même avec Float, du moins dans ce scénario , semble en fait fonctionner: lesround(Float(8.46) * pow(10.0, 3.0)) / pow(10.0, 3.0)
rendements8.46
. Juste quelque chose à noter.No '*' candidates produce the expected contextual result type 'FloatingPointRoundingRule'
Pour arrondir
totalWorkTimeInHours
à 3 chiffres pour l'impression, utilisez leString
constructeur qui prend uneformat
chaîne:la source
String(format: "%.3f", 1.23489)
imprime1.235
Avec Swift 5, selon vos besoins, vous pouvez choisir l'un des 9 styles suivants afin d'avoir un résultat arrondi de a
Double
.#1. Utilisation de la
FloatingPoint
rounded()
méthodeDans le cas le plus simple, vous pouvez utiliser la
Double
rounded()
méthode.# 2. Utilisation de la
FloatingPoint
rounded(_:)
méthode# 3. Utilisation de la
round
fonction DarwinLa Fondation propose une
round
fonction via Darwin.# 4. Utilisation d'une
Double
méthode personnalisée d'extension construite avec Darwinround
et despow
fonctionsSi vous souhaitez répéter l'opération précédente plusieurs fois, la refactorisation de votre code peut être une bonne idée.
# 5. Utilisation de la
NSDecimalNumber
rounding(accordingToBehavior:)
méthodeSi nécessaire,
NSDecimalNumber
offre une solution détaillée mais puissante pour arrondir les nombres décimaux.# 6. Utilisation de la
NSDecimalRound(_:_:_:_:)
fonction#7. Utilisation de l'
NSString
init(format:arguments:)
initialiseurSi vous souhaitez renvoyer un
NSString
de votre opération d'arrondi, l'utilisation de l'NSString
initialiseur est une solution simple mais efficace.# 8. Utilisation de l'
String
init(format:_:)
initialiseurLe
String
type de Swift est ponté avec laNSString
classe de la Fondation . Par conséquent, vous pouvez utiliser le code suivant afin de renvoyer unString
de votre opération d'arrondi:# 9. En utilisant
NumberFormatter
Si vous prévoyez d'obtenir un résultat
String?
de votre opération d'arrondi,NumberFormatter
propose une solution hautement personnalisable.la source
Decimal
, qui est un pont gratuitNSDecimalNumber
.Decimal
est de type natif de Swift et offre un soutien plus élégant pour les opérateurs autochtones comme+
,-
, etc.NSDecimalRound(_:_:_:_:)
fonction. Merci.NumberFormatter
c'est la dernière option alors qu'elle devrait être la première pour présenter des chiffres aux utilisateurs. Aucune autre méthode ne génère de nombres correctement localisés.Dans Swift 2.0 et Xcode 7.2:
Exemple:
la source
Ceci est un code entièrement travaillé
Swift 3.0 / 4.0 / 5.0, Xcode 9.0 GM / 9.2 et supérieur
sortie - 123
sortie - 123,3
sortie - 123,33
sortie - 123.326
la source
S'appuyant sur la réponse de Yogi, voici une fonction Swift qui fait le travail:
la source
Dans Swift 3.0 et Xcode 8.0:
Utilisez cette extension comme ceci:
la source
Swift 4, Xcode 10
la source
Le code pour les chiffres spécifiques après les décimales est:
Ici, le% .3f indique au swift de faire ce nombre arrondi à 3 décimales. Et si vous voulez un double nombre, vous pouvez utiliser ce code:
var roundedString = Double(String(format: "%.3f", b))
la source
Utilisez la bibliothèque Foundation Darwin intégrée
SWIFT 3
Usage:
Sorties: 12,988
la source
Un moyen pratique peut être l'utilisation de l' extension de type Double
Usage:
la source
Si vous souhaitez arrondir des
Double
valeurs, vous pouvez utiliser SwiftDecimal
afin de ne pas introduire d'erreurs pouvant apparaître lorsque vous essayez de calculer avec ces valeurs arrondies. Si vous utilisezDecimal
, il peut représenter avec précision les valeurs décimales de cette valeur arrondie à virgule flottante.Vous pouvez donc faire:
Ensuite, vous pouvez obtenir la
Decimal
valeur arrondie comme suit:Et si vous souhaitez l'afficher avec un nombre spécifié de décimales (ainsi que localiser la chaîne pour les paramètres régionaux actuels de l'utilisateur), vous pouvez utiliser un
NumberFormatter
:la source
(4.81).roundedDecimal(to: 2, mode: .down)
renverra 4,8 au lieu de 4,81, utilisezDecimal(string: self.description)!
pour une précisiondecimalValue
Double
(cela devient4.8099999999999996
). Mais je déconseille l'utilisationdescription
(car l'arrondi qu'il utilise n'est pas documenté et est susceptible de changer). Si vous voulez vraiment faire des mathématiques avec une précision décimale, vous devez éviterDouble
complètement et utiliser à la placeDecimal
directement (par exempleDecimal(sign: .plus, exponent: -2, significand: 481)
ouDecimal(string: "4.81")
. Mais ne pas utiliserdescription
.description
méthode n'est ni documenté ni garanti. De plus, ce n'est pas localisé. À mon humble avis, c'est une erreur à utiliserdescription
à des fins autres que la journalisation. J'utiliseraisDecimal
tout au long, en évitant d'utiliserDouble
complètement, ou j'utiliserais simplement un mode d'arrondi différent. Ou, si vous le devez, utilisez votre propre méthode localisée qui utilise l'algorithme de style Grisu (mais cela semble inutile lorsque vous savez combien de décimales vous voulez arrondir). Mais j'éviterais de compter sur ce comportement accessoire dedescription
.Il s'agit d'une sorte de longue solution de contournement, qui peut être utile si vos besoins sont un peu plus complexes. Vous pouvez utiliser un formateur de nombres dans Swift.
Supposons que votre variable que vous souhaitez imprimer soit
Cela garantira qu'il est retourné dans le format souhaité:
Le résultat sera donc ici "3,6" (arrondi). Bien que ce ne soit pas la solution la plus économique, je la donne parce que l'OP a mentionné l'impression (auquel cas une chaîne n'est pas indésirable), et parce que cette classe permet de définir plusieurs paramètres.
la source
j'utiliserais
et changez .3f en n'importe quel nombre de nombres décimaux dont vous avez besoin
la source
Soit:
En utilisant
String(format:)
:Typecast
Double
versString
avec%.3f
spécificateur de format, puis retour àDouble
Ou étendez-vous
Double
pour gérer les décimales N:Par calcul
multipliez par 10 ^ 3, arrondissez-le puis divisez par 10 ^ 3 ...
Ou étendez-vous
Double
pour gérer les décimales N:la source
Il s'agit d'un algorithme plus flexible d'arrondi à N chiffres significatifs
Solution Swift 3
la source
La meilleure façon de formater une double propriété est d'utiliser les méthodes prédéfinies d'Apple.
FloatingPointRoundingRule est une énumération qui a les possibilités suivantes
Cas de dénombrement:
case awayFromZero Arrondit à la valeur autorisée la plus proche dont la magnitude est supérieure ou égale à celle de la source.
case down Arrondit à la valeur autorisée la plus proche inférieure ou égale à la source.
case toNearestOrAwayFromZero Arrondit à la valeur autorisée la plus proche; si deux valeurs sont également proches, celle de plus grande ampleur est choisie.
case toNearestOrEven Arrondit à la valeur autorisée la plus proche; si deux valeurs sont également proches, la paire est choisie.
case vers zéro arrondi à la valeur autorisée la plus proche dont la magnitude est inférieure ou égale à celle de la source.
case up Arrondit à la valeur autorisée la plus proche, supérieure ou égale à la source.
la source
arrondir une valeur double à x nombre décimal
NO . de chiffres après la décimale
la source
Pas Swift mais je suis sûr que vous avez l'idée.
la source
Cela semble fonctionner dans Swift 5.
Assez surpris qu'il n'y ait pas déjà de fonction standard pour cela.
// Troncature des doubles à n décimales avec arrondi
la source
Vous pouvez ajouter cette extension:
et appelez-le comme ceci:
la source
Pour éviter les imperfections du flotteur, utilisez Decimal
ex.
1075,58 arrondis à 1075,57 lorsque vous utilisez Float avec échelle: 2 et .down
1075,58 arrondis à 1075,58 lorsque vous utilisez Decimal avec échelle: 2 et .down
la source
J'ai trouvé cela me demandant s'il était possible de corriger l'entrée d'un utilisateur. C'est-à-dire s'ils entrent trois décimales au lieu de deux pour un montant en dollars. Dites 1.111 au lieu de 1.11 pouvez-vous le corriger en arrondissant? La réponse pour de nombreuses raisons est non! Avec de l'argent, plus de 0,001 finirait par causer des problèmes dans un vrai chéquier.
Voici une fonction pour vérifier l'entrée des utilisateurs pour trop de valeurs après la période. Mais ce qui permettra 1., 1.1 et 1.11.
Il est supposé que la valeur a déjà été vérifiée pour la conversion réussie d'une chaîne en un double.
la source
la source
Utilisation:
la source
En voici un pour SwiftUI si vous avez besoin d'un élément Text avec la valeur numérique.
la source