双打的除法

时间:2019-03-17 21:47:51

标签: swift

我有双打数组:

var dates: [Double] = [1542412800000,
    1542499200000,
    1543017600000,
    1543708800000,
    1544659200000,
    1547164800000,
    1550880000000]

(是的,它实际上是日期时间戳)。我想要的是将其转换为百分比数组。例如,如果我有一个[5,20,25]数组,我希望输出[0.20,0.8,1],即当前值的百分比。我结束了:

let percentages: [Double] = dates
    .map{$0 - dates.first!}
    .map{$0/dates.last!}
percentages.forEach{ it in
    print(it)
}

但是输出是:

0.0
5.5710306406685235e-05
0.00038997214484679665
0.0008356545961002785
0.0014484679665738162
0.003064066852367688
0.005459610027855153

第二值有点奇怪。该如何解决?

3 个答案:

答案 0 :(得分:2)

在将每个值除以最后一个map语句中的最后一个值时,您将忽略一个事实,即所有内容均已被第一个值减去。

要解决此问题,应除以值的范围(最大值和最小值之差)。

假设您的数组已排序,则为:

guard let maxValue = dates.last, let minValue = dates.first else {
    return
}
let percentages = dates
    .map {$0 - minValue}
    .map {$0 / (maxValue - minValue)}

这将规范化所有值,使得第一个值为0,最后一个值为1,其他所有值都介于两者之间。

如果您不想将第一个值标准化为0(但将所有值都保持在0和1之间),则可以省略减法步骤:

let percentages = dates.map {$0 / maxValue}

如果未对数组进行排序,则可以使用数组的.min().max()函数:

guard let maxValue = dates.max(), let minValue = dates.min() else {
    return
}

答案 1 :(得分:2)

您可以这样操作:

let dates: [Double] = [1542412800000,
                       1542499200000,
                       1543017600000,
                       1543708800000,
                       1544659200000,
                       1547164800000,
                       1550880000000]

let sorted = dates.sorted()

guard let first = sorted.first,
    let last = sorted.last,
    last != first
    else {
    fatalError()
}

let denominator = last - first

let percentages = sorted.map { ($0 - first)/denominator }

print(percentages) //[0.0, 0.01020408163265306, 0.07142857142857142, 0.15306122448979592, 0.2653061224489796, 0.5612244897959183, 1.0]

答案 2 :(得分:1)

使用您的代码样式,您应该使用以下代码:

var dates: [Double] = [1542412800000,
                       1542499200000,
                       1543017600000,
                       1543708800000,
                       1544659200000,
                       1547164800000,
                       1550880000000]

let intermediate: [Double] = dates
    .map{$0 - dates.first!}
    let percentages = intermediate
    .map{$0/intermediate.last!}
percentages.forEach{ it in
    print(it)
}

真正的问题是您将每个元素除以“初始”最大值(而不是最小值)。