7 ответов:
Попробуйте "настилать" двойное значение, а затем проверить, не изменилось ли оно:
let dbl = 2.0 let isInteger = floor(dbl) == dbl // trueТерпит неудачу, если это не целое число
let dbl = 2.4 let isInteger = floor(dbl) == dbl // false
Проверьте, равен Ли
% 1нулю:Свифт 3:
let dbl = 2.0 let isInteger = dbl.truncatingRemainder(dividingBy: 1) == 0Свифт 2:
let dbl = 2.0 let isInteger = dbl % 1 == 0
Небольшое расширение для проверки этого:
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
Простое Решение
Я предлагаю преобразовать значение в
Int, затем вDoubleи проверить новое значениеif value == Double(Int(value)) { // The value doesn't have decimal part. ex: 6.0 } else { // The value has decimal part. ex: 6.3 }
Использование mod ( % ) больше не будет работать.
Теперь вы можете использовать:
let dbl = 2.0 let isInteger = dbl.truncatingRemainder(dividingBy: 1.0) == 0.0
Comments