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)
où self.value
est un double.
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
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
Swift 3
if dbl.truncatingRemainder(dividingBy: 1) == 0 {
//it's an integer
}
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
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
}
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
Utiliser mod (%) ne fonctionnera plus.
Vous pouvez maintenant utiliser:
let dbl = 2.0
let isInteger = dbl.truncatingRemainder(dividingBy: 1.0) == 0.0