有没有办法确定浮点数是否具有非零十进制值?我想避免字符串转换,然后拆分任何小数。但不确定是否还有其他方式。
答案 0 :(得分:1)
浮点变量(Float
和Double
)存储有限制的值。很少会将数字存储为.000...
。
请参阅Is floating point math broken?
首先,确定一个你认为“远离.000...
的epsilon值,因为一个数字可以让我仍然认为它是'整体'”。此数字取决于您的问题域。假设我.001
内的值是可接受的“整体”
其次,通过四舍五入确定最接近的整数。
最后,从圆形对应物中减去原始值,并检查差值是否小于epsilon值。
import Foundation
extension Double {
private static var epsilon = 0.0001
var isWhole: Bool { return abs(self - round(self)) < Double.epsilon }
}
let input = 1.0
print(input.isWhole)
这与用于比较两个Float/Double
值的相等性的推荐技术非常相似。
答案 1 :(得分:0)
由于Swift 3.0快速接近,我将为其提供一个答案,即使问题专门涵盖Swift 2。
在Swift 3.0中Enhanced Floating Point Protocols已经实现,使得使用浮点算术变得更容易。我们可以,例如使用实现IEEE 754等式谓词的isEqual
方法来比较两个浮点数
import Foundation // for access to round function
extension Double {
var isAsGoodAsIntegerValuedAsItGets: Bool {
return isEqual(to: round(self))
}
}
var input = 1.01
print(input.isAsGoodAsIntegerValuedAsItGets) // false
input = 1
print(input.isAsGoodAsIntegerValuedAsItGets) // true
/* increase to least representable value that compares
greater than current `self` */
input = input.nextUp
print(input.isAsGoodAsIntegerValuedAsItGets) // false
/* decrease to the greatest representable value that
compares less than current `self` */
input = input.nextDown
print(input.isAsGoodAsIntegerValuedAsItGets) // true