web-dev-qa-db-fra.com

Obtenir la partie décimale d'un double dans Swift

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?

20
user3925713

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

13
Otávio Monteagudo

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.

doc Apple

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
70
Nico

Swift 2:

Vous pouvez utiliser:

modf(x).1

ou

x % floor(abs(x))
12
Alessandro Ornano

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
7
Leo Dabus

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
5
Ahmad
let x:Double = 1234.5678

let y = Int(x) //1234

let result = x - Double(y) //1234.5678 - 1234.0 = 0.5678
0
Picode

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

    }

}
0
Super Xtreem

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.

0
j.s.com

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)
0
Yodagama

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
0
Jessy