You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:24:02