Ответ 1
Попробуйте "настил" двойное значение, а затем проверьте, не изменилось ли оно:
let dbl = 2.0
let isInteger = floor(dbl) == dbl // true
Сбой, если он не является целым числом
let dbl = 2.4
let isInteger = floor(dbl) == dbl // false
Мне нужно проверить, является ли двузначная переменная конвертируемой в Int без потери ее значения. Это не работает, потому что они имеют разные типы:
if self.value == Int(self.value)
где self.value
является двойным.
Попробуйте "настил" двойное значение, а затем проверьте, не изменилось ли оно:
let dbl = 2.0
let isInteger = floor(dbl) == dbl // true
Сбой, если он не является целым числом
let dbl = 2.4
let isInteger = floor(dbl) == dbl // false
проверьте, равен ли % 1
:
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 an integer
}
Небольшое расширение для проверки:
extension FloatingPoint {
var isInt: Bool {
return floor(self) == self
}
}
Тогда просто сделайте
let anInt = 1.isInt
let nonInt = 3.142.isInt
Как преобразовать Double в Int (который будет обрезать десятичные числа), затем вернуться к Double, а затем сравнить это с оригинальным Double? Например:
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
Использование mod (%) больше не будет работать.
Теперь вы можете использовать:
let dbl = 2.0
let isInteger = dbl.truncatingRemainder(dividingBy: 1.0) == 0.0