Проверка, является ли двойное значение целым числом-Swift



Мне нужно проверить, преобразуется ли двойная переменная в Int, не теряя своего значения. Это не работает, потому что они бывают разных типов:



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


Где self.value - двойник.

560   7  

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

Swift 3

if dbl.truncatingRemainder(dividingBy: 1) == 0 {
  //it's 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

Простое Решение

Я предлагаю преобразовать значение в 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

    Ничего не найдено.