检查双精度值是否为整数 - Swift
Checking if a double value is an integer - Swift
我需要检查双重定义的变量是否可以转换为 Int 而不会丢失其值。这不起作用,因为它们属于不同类型:
if self.value == Int(self.value)
其中 self.value
是双精度数。
尝试'flooring' double 值然后检查它是否不变:
let dbl = 2.0
let isInteger = floor(dbl) == dbl // true
如果不是整数则失败
let dbl = 2.4
let isInteger = floor(dbl) == dbl // false
extension FloatingPoint {
var isWholeNumber: Bool { isNormal ? self == rounded() : isZero }
}
let double = 3.0
double.isWholeNumber // true
print(3.15.isWholeNumber) // 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's an integer
}
使用 mod (%) 将不再有效。
您现在可以使用:
let dbl = 2.0
let isInteger = dbl.truncatingRemainder(dividingBy: 1.0) == 0.0
如何将 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
检查这个的小扩展:
extension FloatingPoint {
var isInt: Bool {
return floor(self) == self
}
}
那就干
let anInt = 1.isInt
let nonInt = 3.142.isInt
简单的解决方案
我建议将值转换为 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
}
Swifty 方式:
let cals = [2.5, 2.0]
let r = cals.map{ Int(exactly: [=10=]) == nil ? "\([=10=])" : "\(Int([=10=]))" }
r // ["2.5", "2"]
隐藏在扩展中:
extension Array where Element == Double {
var orExactly: [String] {
map{ Int(exactly: [=11=]) == nil ? "\([=11=])" : "\(Int([=11=]))" }
}
}
cals.orExactly
小心。
truncatingRemainder(dividingBy:) 可能很棘手。见下文:
Swift 4:
//case 1
let reminder = (4.1 * 100).truncatingRemainder(dividingBy: 1.0)
//case 2
let reminder2 = (410).truncatingRemainder(dividingBy: 1.0)
// reminder = 0.9999999999999432
// reminder2 = 0
使用@ColinE answer,我构建了一个扩展来处理 Double 无法转换为 Int 和另一个函数 returns 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)
}
}
我希望这对某人有所帮助,
哈维
现在有一个 Int(exactly:)
初始化程序可以直接告诉你这个,而不会有 out-of-range 个整数的问题。
if Int(exactly: self) != nil { ... }
如果结果实际上可以准确地存储在 Int 中,这只会 return 一个 non-nil 值。有许多 Double 值是“整数”但不适合 Int。 (请参阅 MartinR 对已接受答案的评论。)
我需要检查双重定义的变量是否可以转换为 Int 而不会丢失其值。这不起作用,因为它们属于不同类型:
if self.value == Int(self.value)
其中 self.value
是双精度数。
尝试'flooring' double 值然后检查它是否不变:
let dbl = 2.0
let isInteger = floor(dbl) == dbl // true
如果不是整数则失败
let dbl = 2.4
let isInteger = floor(dbl) == dbl // false
extension FloatingPoint {
var isWholeNumber: Bool { isNormal ? self == rounded() : isZero }
}
let double = 3.0
double.isWholeNumber // true
print(3.15.isWholeNumber) // 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's an integer
}
使用 mod (%) 将不再有效。
您现在可以使用:
let dbl = 2.0
let isInteger = dbl.truncatingRemainder(dividingBy: 1.0) == 0.0
如何将 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
检查这个的小扩展:
extension FloatingPoint {
var isInt: Bool {
return floor(self) == self
}
}
那就干
let anInt = 1.isInt
let nonInt = 3.142.isInt
简单的解决方案
我建议将值转换为 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
}
Swifty 方式:
let cals = [2.5, 2.0]
let r = cals.map{ Int(exactly: [=10=]) == nil ? "\([=10=])" : "\(Int([=10=]))" }
r // ["2.5", "2"]
隐藏在扩展中:
extension Array where Element == Double {
var orExactly: [String] {
map{ Int(exactly: [=11=]) == nil ? "\([=11=])" : "\(Int([=11=]))" }
}
}
cals.orExactly
小心。
truncatingRemainder(dividingBy:) 可能很棘手。见下文:
Swift 4:
//case 1
let reminder = (4.1 * 100).truncatingRemainder(dividingBy: 1.0)
//case 2
let reminder2 = (410).truncatingRemainder(dividingBy: 1.0)
// reminder = 0.9999999999999432
// reminder2 = 0
使用@ColinE answer,我构建了一个扩展来处理 Double 无法转换为 Int 和另一个函数 returns 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)
}
}
我希望这对某人有所帮助,
哈维
现在有一个 Int(exactly:)
初始化程序可以直接告诉你这个,而不会有 out-of-range 个整数的问题。
if Int(exactly: self) != nil { ... }
如果结果实际上可以准确地存储在 Int 中,这只会 return 一个 non-nil 值。有许多 Double 值是“整数”但不适合 Int。 (请参阅 MartinR 对已接受答案的评论。)