J'essaie de séparer les parties décimales et entières d'un double dans Swift. J'ai essayé un certain nombre d'approches, mais elles se heurtent toutes au même problème ...
let x:Double = 1234.5678
let n1:Double = x % 1.0 // n1 = 0.567800000000034
let n2:Double = x - 1234.0 // same result
let n3:Double = modf(x, &integer) // same result
Existe-t-il un moyen d'obtenir 0,5678 au lieu de 0,567800000000034 sans convertir le nombre en une chaîne?
Sans le convertir en chaîne, vous pouvez arrondir à un nombre de décimales comme celui-ci:
let x:Double = 1234.5678
let numberOfPlaces:Double = 4.0
let powerOfTen:Double = pow(10.0, numberOfPlaces)
let targetedDecimalPlaces:Double = round((x % 1.0) * powerOfTen) / powerOfTen
Votre sortie serait
0,5678
Vous pouvez utiliser truncatingRemainder
et 1
comme séparateur.
Renvoie le reste de cette valeur divisé par la valeur donnée en utilisant la division tronquée.
Exemple:
let myDouble1: Double = 12.25
let myDouble2: Double = 12.5
let myDouble3: Double = 12.75
let remainder1 = myDouble1.truncatingRemainder(dividingBy: 1)
let remainder2 = myDouble2.truncatingRemainder(dividingBy: 1)
let remainder3 = myDouble3.truncatingRemainder(dividingBy: 1)
remainder1 -> 0.25
remainder2 -> 0.5
remainder3 -> 0.75
Swift 2:
Vous pouvez utiliser:
modf(x).1
ou
x % floor(abs(x))
Même approche qu'Alessandro Ornano implémenté en tant que propriété d'instance du protocole FloatingPoint:
Xcode 11 • Swift 5.1
extension FloatingPoint {
var whole: Self { modf(self).0 }
var fraction: Self { modf(self).1 }
}
1.2.whole // 1
1.2.fraction // 0.2
Utilisez Float
car il a moins de chiffres de précision que Double
let x:Double = 1234.5678
let n1:Float = Float(x % 1) // n1 = 0.5678
let x:Double = 1234.5678
let y = Int(x) //1234
let result = x - Double(y) //1234.5678 - 1234.0 = 0.5678
Il y a une fonction dans la bibliothèque mathématique de C, et de nombreux langages de programmation, Swift inclus, vous y donne accès. Il s'appelle modf, et dans Swift, il fonctionne comme ceci
// modf renvoie un Tuple à 2 éléments,
// avec la partie entière dans le premier élément,
// et la partie fraction dans le deuxième élément
soit splitPi = modf (3.141592)
splitPi.0 // 3.
splitPi.1 // 0,141592
Vous pouvez créer une extension comme ci-dessous,
extension Double {
func getWholeNumber() -> Double {
return modf(self).0
}
func getFractionNumber() -> Double {
return modf(self).1
}
}
Vous pouvez obtenir la partie entière comme ceci:
let d: Double = 1.23456e12
let intparttruncated = trunc(d)
let intpartroundlower = Int(d)
La fonction trunc () tronque la partie après le point décimal et la fonction Int () arrondit à la valeur inférieure suivante. C'est la même chose pour les nombres positifs mais une différence pour les nombres négatifs. Si vous soustrayez la partie tronquée de d, vous obtiendrez la partie fractionnaire.
func frac (_ v: Double) -> Double
{
return (v - trunc(v))
}
Vous pouvez obtenir Mantissa et l'exposant d'une valeur double comme ceci:
let d: Double = 1.23456e78
let exponent = trunc(log(d) / log(10.0))
let mantissa = d / pow(10, trunc(log(d) / log(10.0)))
Votre résultat sera 78 pour l'exposant et 1,23456 pour la Mantissa.
J'espère que cela vous aidera.
Swift 5.1
let x:Double = 1234.5678
let decimalPart:Double = x.truncatingRemainder(dividingBy: 1) //0.5678
let integerPart:Double = x.round(.towardZero) //1234
Ces deux méthodes renvoient une valeur Double.
si vous voulez un nombre entier comme entier, vous pouvez simplement utiliser,
Int(x)
Il est impossible de créer une solution qui fonctionnera pour tous les Doubles
. Et si les autres réponses ont déjà fonctionné, ce que je crois également impossible, elles ne fonctionnent plus.
let _5678 = 1234.5678.description.drop { $0 != "." } .description // ".5678"
Double(_5678) // 0.5678
let _567 = 1234.567.description.drop { $0 != "." } .description // ".567"
Double(_567) // 0.5669999999999999