web-dev-qa-db-fra.com

Vérifier si une valeur double est un entier - Swift

Je dois vérifier si une variable à double définition est convertible en Int sans perdre sa valeur. Cela ne fonctionne pas car ils sont de types différents:

if self.value == Int(self.value)

self.value est un double.

33
Youssef Moawad

Essayez de «lisser» la double valeur puis de vérifier si elle est inchangée:

let dbl = 2.0
let isInteger = floor(dbl) == dbl // true

Echoue si ce n'est pas un entier

let dbl = 2.4
let isInteger = floor(dbl) == dbl // false
62
ColinE

vérifie si % 1 est zéro:

Swift 3:

let dbl = 2.0
let isInteger = dbl.truncatingRemainder(dividingBy: 1) == 0

Swift 2:

let dbl = 2.0
let isInteger = dbl % 1 == 0
41
rintaro

Swift 3

if dbl.truncatingRemainder(dividingBy: 1) == 0 {
  //it's an integer
}
18
William T.

Une petite extension à vérifier pour cela:

extension FloatingPoint {
    var isInt: Bool {
        return floor(self) == self
    }
}

Alors fais juste

let anInt = 1.isInt
let nonInt = 3.142.isInt
3
Ciprian Rarau

Solution simple

Je suggère de convertir la valeur en Int puis en Double et de vérifier la nouvelle valeur

if value == Double(Int(value)) {
// The value doesn't have decimal part. ex: 6.0

} else {
//  The value has decimal part. ex: 6.3

}
3
Musa almatri

Que diriez-vous de convertir le Double en Int (qui coupera les décimales), puis de revenir en Double, puis de le comparer au Double original? Par exemple:

var dbl:Double = 22/3
dbl == Double(Int(dbl))
// false: dbl = 7.33333... Double(Int(dbl)) = 7.0

dbl = 25
dbl == Double(Int(dbl))
// true: dbl = 25.0, Double(Int(dbl)) = 25.0
1
Gallaugher

Utiliser mod (%) ne fonctionnera plus.

Vous pouvez maintenant utiliser:

let dbl = 2.0
let isInteger = dbl.truncatingRemainder(dividingBy: 1.0) == 0.0
0
Chad