您的问题有点复杂,因为您的 Doubles 相等性基于 小数点后的前 3 位。许多线程都描述了在应用简单相等的情况下删除重复项,但我在您的问题中找不到一个包括带有比较的 Doubles。
您通常使用Set 来消除重复,但Set<Double> 使用严格相等,这不能满足您的要求。
标准化值可能适用于您的情况:
extension Double {
var my_normalized: Double {
return (self * 1000).rounded() / 1000
}
}
print(0.0050000000000000001.my_normalized == 0.0051.my_normalized) //->true
使用它,您可以编写如下内容:
let arr = [0.75, 0.0050000000000000001, 0.0050000000000000001, 0.0050000000000000001, 0.0050000000000000001, 0.0050000000000000001, 0.0040000000000000001 /*,...*/]
var valueSet: Set<Double> = []
var result: [Double] = []
arr.forEach {value in
let normalizedValue = value.my_normalized
if !valueSet.contains(normalizedValue) {
valueSet.update(with: normalizedValue)
result.append(value)
}
}
print(result) //->[0.75, 0.0050000000000000001, 0.0040000000000000001]
如果你不介意结果的顺序,它可以包含规范化的值,代码可以更简单:
let simpleResult = Array(Set(arr.map {$0.my_normalized}))
print(simpleResult) //->[0.75, 0.0050000000000000001, 0.0040000000000000001]