嗨,我在这里比较双倍值是否相等。但即使两个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
答案 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