我需要检查双定义变量是否可以转换为Int而不会丢失其值。这不起作用,因为它们的类型不同:
if self.value == Int(self.value)
其中self.value
是双倍的。
答案 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对已接受答案的评论。)