Swift 4中如何比较两个Double数组并生成差值数组?
嘿,这个问题很常见,我来一步步教你怎么实现!首先我们得明确需求:把两个数组对应位置的元素相减,结果存到新数组里对吧?
方法一:手动写for循环(满足你要的循环逻辑)
首先要注意的是,必须先确保两个数组的长度一致,不然循环的时候会因为索引越界导致崩溃。所以第一步先做长度校验,然后再遍历每个索引计算差值:
var freshRates = [1.6, 1.7, 2.0] var oldRates = [1.5, 1.4, 1.9] var difference: [Double] = [] // 先校验数组长度,避免索引越界 guard freshRates.count == oldRates.count else { print("两个数组长度不匹配,无法计算对应位置的差值") difference = [] // 这里可以根据你的业务需求做其他处理,比如直接返回或者抛出错误 exit(0) } // 遍历每个索引,计算差值并添加到结果数组 for index in 0..<freshRates.count { let currentDiff = freshRates[index] - oldRates[index] difference.append(currentDiff) } print(difference) // 输出: [0.10000000000000009, 0.30000000000000004, 0.10000000000000009]
这段代码里,guard语句会先检查两个数组的长度是否相等,如果不相等就直接输出提示并终止(你可以根据实际情况调整这里的逻辑,比如只取较短数组的长度来计算)。然后通过for index in 0..<count的方式遍历每个位置,取出对应元素相减,再把结果添加到difference数组里。
方法二:Swift风格的简洁写法(进阶)
如果你不想手动写循环,Swift提供了更优雅的方式,用zip和map组合,一行代码就能搞定:
difference = zip(freshRates, oldRates).map { fresh, old in fresh - old } // 或者更简短的闭包写法: difference = zip(freshRates, oldRates).map { $0 - $1 }
解释一下:
zip(freshRates, oldRates)会把两个数组的对应元素配对成元组(比如第一个元组是(1.6, 1.5),第二个是(1.7, 1.4))map会遍历每一个元组,执行减法操作,最后直接生成结果数组- 如果两个数组长度不一样,
zip会自动以较短的数组长度为准,不会出现越界问题
关于浮点数精度的小提示
你可能注意到输出的差值有很多小数位(比如0.10000000000000009),这是Double浮点数的精度特性导致的,不是代码错误。如果需要格式化结果,可以这样处理:
1. 格式化为字符串(保留指定小数位)
let formattedDiff = difference.map { String(format: "%.2f", $0) } print(formattedDiff) // 输出: ["0.10", "0.30", "0.10"]
2. 保留Double类型并调整精度
如果需要继续用Double类型,可以给Double扩展一个方法来保留指定小数位:
extension Double { func rounded(toPlaces places: Int) -> Double { let divisor = pow(10.0, Double(places)) return (self * divisor).rounded() / divisor } } let roundedDiff = difference.map { $0.rounded(toPlaces: 2) } print(roundedDiff) // 输出: [0.1, 0.3, 0.1]
内容的提问来源于stack exchange,提问作者Ula
相关产品推荐
相关产品推荐

