检查double值是否为整数 - Swift

时间:2015-02-11 06:17:45

标签: swift int double

我需要检查双定义变量是否可以转换为Int而不会丢失其值。这不起作用,因为它们的类型不同:

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

其中self.value是双倍的。

10 个答案:

答案 0 :(得分:64)

尝试地板'然后检查double值是否保持不变:

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

如果不是整数

则失败
let dbl = 2.4
let isInteger = floor(dbl) == dbl // false

答案 1 :(得分:42)

检查% 1是否为零:

斯威夫特3:

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

Swift 2:

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

答案 2 :(得分:18)

Swift 3

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

答案 3 :(得分:3)

要检查此内容的小扩展程序:

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

然后就这样做

let anInt = 1.isInt
let nonInt = 3.142.isInt

答案 4 :(得分:3)

简单解决方案

我建议先将值转换为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

}

答案 5 :(得分:2)

快速方式:

let cals = [2.5, 2.0]

let r = cals.map{ return Int(exactly: $0) == nil ?  "\($0)" : "\(Int($0))" }

r // ["2.5", "2"]

答案 6 :(得分:2)

请谨慎。

truncatingRemainder(dividingBy :)可能很棘手。见下文:

迅速4:

@Injectable()
export class PresentationService {
    public fileSelected?: File;
    private handlersSubject= new BehaviorSubject<File>(undefined);
    public handlerObs$ = this.handlersSubject.asObservable();

    public handlers(file: any): void {
        this.handlersSubject.next(file);
    }
}

答案 7 :(得分:2)

使用@ColinE答案,我构建了一个扩展,用于处理Double无法转换为Int时的情况,以及另一个返回Int的函数:

extension Double {

    func isInt() -> Bool {
        guard Double(Int.min) <= self && self <= Double(Int.max) else {
            return false
        }

        return floor(self) == self
    }

    func toInt() -> Int? {
        guard Double(Int.min) <= self && self <= Double(Int.max) else {
            return nil
        }

        return Int(self)
    }
}

我希望这对某人有帮助

Xavi

答案 8 :(得分:1)

如何将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

答案 9 :(得分:1)

现在有一个Int(exactly:)初始化程序,可以直接告诉您这一点,而不会出现整数超出范围的问题。

if Int(exactly: self) != nil { ... }

仅当结果可以实际存储在Int中时,这只会返回非null值。有许多Double值是“整数”,但不适合Int。 (请参阅MartinR对已接受答案的评论。)