如何判断浮点数是否为非零小数?

时间:2016-07-17 01:13:48

标签: swift2

有没有办法确定浮点数是否具有非零十进制值?我想避免字符串转换,然后拆分任何小数。但不确定是否还有其他方式。

2 个答案:

答案 0 :(得分:1)

你不能。

浮点变量(FloatDouble)存储有限制的值。很少会将数字存储为.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 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