即使Swift中的值相等,两个Double值的等式总是会变为false?

时间:2018-03-20 06:10:45

标签: swift xcode swift-playground

嗨,我在这里比较双倍值是否相等。但即使两个Double值都相等,它的回归总是假的。

let latestlogoValue = log(Double(125))/log(5.0)
let latestlogIntValue:Int = Int(latestlogoValue)
print(latestlogoValue)
print(Double(latestlogIntValue))
print(Double(latestlogIntValue) == Double(latestlogoValue)) //Always returning false

4 个答案:

答案 0 :(得分:3)

使用==符号进行双倍或浮点值比较,不会给出确切的答案。您可能认为这两个值彼此相等,但它们略有不同。双打在内存中的存储方式不同。您可以通过打印为String来测试它,如下所示 -

print(String(format: "%.20f", Double(latestlogoValue))) //3.00000000000000044409

print(String(format: "%.20f", Double(latestlogIntValue))) //3.00000000000000000000

因此您可以将比较功能更新为

func isDoubleEqual(_ first: Double, _ second: Double) -> Bool {
    return fabs(first - second) < Double.ulpOfOne
}

答案 1 :(得分:0)

因为Double类型的精度而发生了这种情况 如果我们打印您的值

print(String(format: "a float number: %.55f", latestlogoValue))
print(String(format: "a float number: %.55f", Double(latestlogIntValue)))

我们会看到价值观的差异:

a float number: 3.00000000000000044408920985006261616945266723632812500
a float number: 3.00000000000000000000000000000000000000000000000000000

所以这些值是不同的,如果你需要比较浮点值或双值,可以用一些精度来比较它们

答案 2 :(得分:0)

看看它们的不同之处是不同的。

只需将它们打印出来。

print(Double(latestlogoValue).debugDescription) // 3.0000000000000004
print(Double(latestlogIntValue).debugDescription)  // 3.0

你正在比较那些结果总是错误的。

print(Double(latestlogIntValue) == Double(latestlogoValue))
// 3.0000000000000004 == 3.0 results false obvious

答案 3 :(得分:0)

        let latestlogoValue = log(Double(125))/log(5.0)
        let latestlogIntValue:Int = Int(latestlogoValue)
        print(latestlogoValue)
        print(Double(latestlogIntValue))
        print(Double(latestlogIntValue) == Double(latestlogoValue))

这里是Double(latestlogIntValue)&amp; Double(latestlogoValue))获得​​不同的值。将这些值与Int进行比较,您将得到真实

print(Int(latestlogIntValue) == Int(latestlogoValue)) // true